代理模式-Proxy
名称:
代理模式(Proxy Pattern)-对象结构型模式
问题:
The Proxy design pattern Provides a surrogate or placeholder for another object to control access to it.
为其他对象提供一种代理以控制对这个对象的访问。
适用性:
-远程代理为一个对象在不同的地址空间提供局部代表。
-虚代理根据需要创建开销很大的对象。
-保护代理控制对原始对象的访问。
- 智能指引取代了简单的指针,它在访问对象的时候执行一些附加操作。
协作:
代理根据其种类,在适当的时候向realSubject转发请求。
优点和缺点:
1、Remote Proxy可以隐藏一个对象存在于不同地址空间的事实。
2、Virtual Proxy可以进行最优化,例如根据要求创建对象。
3、Protection Proxies和Smart Reference 都允许在访问一个对象的时候有一些附加的内务处理。
解决方案:
1、 模式的参与者
1、Proxy
-保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,Proxy会引用Subject。
-提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
-控制对实体店存取,并可能负责创建和删除它。
-其他功能依赖于代理的类型。
2、Subject
-定义RealSubject和Proxy 的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
3、RealSubject
-定义Proxy所代表的实体。
2.实现方式
java中一般三种代理模式:静态代理、动态代理、Cglib代理。
静态代理:
public interface Subject { public void request(); }
public class ConcreteSubject implements Subject { @Override public void request() { } }
public class Proxy implements Subject { private Subject subject = null; public Proxy() { this.subject = new Proxy(); } public Proxy(Subject subject) { this.subject = subject; } @Override public void request() { this.before(); this.subject.request(); this.after(); } private void before() { //do something } private void after() { //do something } }
动态代理
class MyInvocationHandle implements InvocationHandler{ private Object target; public void setTarget(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //do something method.invoke(target, args); //do something return null; } }
Cglib代理
public class MyMethodInterceptor implements MethodInterceptor{ @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { Object object = proxy.invokeSuper(obj, args); return object; } }
参考资料
《设计模式:可复用面向对象软件的基础》