代理模式
代理模式
给某一个对象提供一个代理对象,并有代理对象控制对原对象的引用。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。
1.1代理种类
1.1.1远程(Remote)代理
为一个位于不同地址空间的对象提供一个局域代表对象,远程代理又叫大使。
1.1.2虚拟代理
根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
1.1.3Copy-on-Write代理
虚拟代理的一种,把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
1.1.4保护代理
控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
1.1.5Cache代理
为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
1.1.6防火墙代理
保护目标,不受恶意用户接近。
1.1.7同步化代理
使几个用户同时使用一个对象而没有冲突。
1.1.8智能引用代理
当一个对象被引用时,提供一些额外的操作。
1.2结构
抽象主题角色:声明了真实主题和代理主题的共同接口,使任何可以使用真实主题的地方都可以使用代理主题。
代理主题(Proxy)角色:代理主题角色含有对真实主题角色的引用。
真实主题角色:代理角色所代表的真实对象。
抽象主题角色:
/** * 抽象主题角色 */ public interface Subject { /** * 业务操作 */ void operate(); }
真实主题角色:
/** * 真实主题角色 */ public class RealSubject implements Subject { @Override public void operate() { System.out.println("real operate ..."); } }
代理主题角色:
/** * 代理主题角色 */ public class ProxySubject implements Subject{ private Subject realSubject; private void beforeOperate(){ System.out.println("proxy before operate ..."); } private void afterOperate(){ System.out.println("proxy after operate ..."); } @Override public void operate() { System.out.println("proxy operate ..."); beforeOperate(); if(realSubject == null){ realSubject = new RealSubject(); }; realSubject.operate(); afterOperate(); } }
客户端:
public class Client { public static void main(String[] args) { Subject sub = new ProxySubject(); sub.operate(); } }
小结:
代理模式模式的种类有很多,但他们有个共同点,就是代理角色和真实角色实现了相同的接口或者继承了同一个类。代理角色持有真实角色的引用对象,客户端请求代理角色,代理角色将请求委派给真实角色,同时,代理角色可以在真实角色处理的前后添加增强功能。
参考:
《Java与模式》