简介:我们有时会遇到客户端代码不能或者不想直接访问被调用的对象,例如是一个系统开销很大的对象我们需要延迟创建,只有在真正需要是在调用,或者调用对象在远程主机上,又或者目标对象的功能不足以满足我们的需求。此时我们需要一个代理对象来起到中介的作用代替被代理对象。
静态代理
/**
* 代理与被代理对象的公共接口
* @author LexNg
*
*/
public interface Rent {
void rent();
}
/**
* 这是被代理对象,实现了Rent接口,它具有真实的功能
* @author LexNg
*
*/
public class Host implements Rent {
public void rent(){
System.out.println("出租房屋");
}
}
/**
* 这是代理对象,也实现了Rent接口
* @author LexNg
*
*/
public class HostProxy implements Rent {
//被代理对象的引用
private Rent rent;
public HostProxy(Rent rent){
this.rent = rent;
}
//这里的功能实现借助的是被代理对象Host的功能,本身没有实现这个功能
public void rent(){
if(rent == null){
//在此时才创建被代理对象Host
rent = new Host();
}
rent.rent();
//我们可以在这里添加完善被代理对象Host的rent方法没有的东西
}
}
/**
* 客户端调用
* @author LexNg
*
*/
public class Client {
public static void main(String[] args) {
//新建一个代理对象
Rent rent = new HostProxy(null);
//调用功能,在真正调用功能的时候才创建Host对象,实现了对象的延迟创建
//也可以在代理类里面新增完善功能
rent.rent();
}
}
1、实现了对象的延迟创建,在真正需要时才会创建对象,比如就是Hibernate的延迟加载,A实体依赖于B实体,但加载A实体时不会把B实体的数据记录取出来,此时A实体中的B就是就时一个代理对象,只有当需理理
B实体时才会创建去抓取数据库记录。
2、可以在代理类里面完善被代理对象功能的不足
动态代理
1、动态代理与静态代理的角色是一样的
2、动态代理的代理类是动态生成的
3、基于接口InvocationHandler与基于类Proxy实现
3、javasist生成动态代理
代理模式解析
1599

被折叠的 条评论
为什么被折叠?



