interface IService {
public void execute();
}
class ServiceImpl implements IService {
public ServiceImpl() {
System.out.println("ServiceImpl is create");
}
@Override public void execute() {
System.out.println("ServiceImpl.service is running......");
}
}
public class Proxy implements IService {
private IService service;
public Proxy(IService service) {
this.service = service;
}
@Override public void execute() {
System.out.println("Proxy.service is calling ......");
this.service.execute();
}
public static void main(String[] args) {
IService proxy = new Proxy(new ServiceImpl());
proxy.execute();
IService virtualProxy = new VirtualProxy();
virtualProxy.execute();
}
}
//虚拟代理
class VirtualProxy implements IService {
private IService service;
public VirtualProxy() {}
@Override public void execute() {
System.out.println("VirtualProxy.service is calling ......");
if (this.service == null)
this.service = new ServiceImpl();
this.service.execute();
}
}
输出为:
ServiceImpl is create
Proxy.service is calling ......
ServiceImpl.service is running......
VirtualProxy.service is calling ......
ServiceImpl is create
ServiceImpl.service is running......
* 代理模式:代理类与业务类实现同一个业务接口,代理类通过构造器参数持有业务类对象。
代理类在实现业务方法时,调用真正的业务对象方法实现业务逻辑,并可以在业务方法中进行权限控制
以及添加切面逻辑,从而实现对业务类的代理。
* 意图: 为其他对象提供一种代理以控制对这个对象的访问。
* 远程代理(Remote Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。
* 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,
先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
* 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
* 延迟加载,用代理模式实现延迟加载的一个经典应用就在 Hibernate 框架里面。
* 指针引用,是指当调用真实的对象时,代理处理另外一些事。比如计算真实对象的引用次数。