所谓代理,就是在不修改原有代码的前提下,为原有方法增加额外功能。
代理模式提出了代理的概念设计,在java中,有静态代理和动态代理的代理模式实现落地。
静态代理
原理
静态代理,主要是逻辑上的设计,要求目标类和代理类实现同样的接口,原理如下图:
代理类和目标类需要实现同样的接口,目标类作为代理类的一个属性
接口
public interface IPersonService {
public boolean login(String username,String passwd);
}
实现类(目标类)
public class PersonServiceImpl implements IPersonService{
@Override
public boolean login(String username, String passwd) {
System.out.println("登录校验....");
return username.equals(passwd);
}
}
代理类
public class PersonServiceProxy implements IPersonService {
IPersonService personService;
public PersonServiceProxy(IPersonService personService) {
this.personService = personService;
}
public void before() {
System.out.println("before...");
}
public void after() {
System.out.println("after...");
}
@Override
public boolean login(String username, String passwd) {
before();
System.out.println(username + " start login.");
// 调用目标类的方法
boolean login = personService.login(username, passwd);
after();
return login;
}
}
main方法
public static void main(String[] args) {
PersonServiceImpl personServiceImpl = new PersonServiceImpl();
IPersonService personService = new PersonServiceProxy(personServiceImpl);
personService.login("test", "test");
}
执行结果
动态代理
动态代理的实现有许多种,这里介绍三种,分别是jdk提供的动态代理,cglib的动态代理和sp