代理的例子:我原本要开车去很远的地方买电脑,但是现在我让其他人帮我买了。我就是目标对象,而帮我买电脑的人就是代理对象。他增强了我的功能,然我很简单就买到了电脑。
代理分为静态代理和动态代理两类。
静态代理:分为继承代理和聚合代理两类。主要是用聚合代理。
聚合代理:实例。login方法的增强
UserDao是一个接口
public interface UserDao {
public void login(String s);
}
目标对象类
public class UserDaoImp implements UserDao{
public void login(String name){
System.out.println(""+name+“登录成功”);
}
}
代理对象类
public class LogUserProxy implements UserDao {
UserDaoImp userDaoImp;
public LogUserProxy(UserDaoImp xxx){
xxx=new UserDaoImp();
}
@Override
public void login(String s) {
userDaoImp=new UserDaoImp();
userDaoImp.login(s);
System.out.println("代理成功"); //增强新加的方法
}
目标对象类和代理对象类都实现了UserDao接口
通过代理模式,在实际调用时,只需要new一个代理对象类的对象,同时将目标对象类传入代理对象类的构造方法,随后再调用代理对象类的重写方法,即可完成由目标对象到代理对象的转换。
动态代理
动态代理实际上就是静态代理中聚合的衍生。由上述例子可以知道。要想代理一个目标对象,则必须新建一个代理对象类,假如以后有很多的对象需要代理,就会非常的麻烦。动态代理应运而生。
动态代理的核心思想就是先构建一个JAVA文件,这个JAVA文件当中存放了代理对象类的所有信息,用户只需要把增强的代码写入即可。
JAVA文件经过编译,形成class字节码文件,随后由classLoader类加载器加载进内存。最后,通过反射机制即可返回一个目标对象类的实例。
这样一来,项目当中就不会存在很多代理类,代理类统一有虚拟机进行管理维护。