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 框架里面。
* 指针引用,是指当调用真实的对象时,代理处理另外一些事。比如计算真实对象的引用次数。