设计模式目录:
代理模式为另一个对象提供一个替身或占位符以控制这个对象的访问。
使用代理模式创建代表,让代表对象控制某些对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或者需要安全控制的对象。
几种代理控制访问的方式:
- 远程代理控制访问远程对象(见上篇博客JAVA RMI 实例)
- 虚拟代理控制访问创建开销大的资源
- 保护代理基于权限控制对资源的访问
远程代理
- Subject, 为RealSubject和Proxy提供了接口, 通过实现同一个接口, Proxy在RealSubject出现的地方取代它
- RealSubject是真正做事的对象,它是被proxy代理和控制访问的对象.
- Proxy持有RealSubject的引用。在某些例子中, Proxy还会负责RealSubject对象的创建与销毁.客户和RealSubject的交互都必须通过Proxy.因为Proxy和RealSbuject实现相同的接口(Subject),所以任何用到RealSubject的地方,都可以用Proxy取代。Proxy也控制了对RealSubject的访问,在某些情况下,我们可能需要这样的控制。这些情况包括RealSubject是远程的对象, RealSubject创建开销大, 或RealSubject需要被保护。
源代码
抽象对象角色
package cn.telling.rmi; /** * * @ClassName: AbstractObject * TODO * @author xingle * @date 2015-9-29 上午10:48:42 */ public abstract class AbstractObject { //操作 public abstract void operation(); }
目标对象角色
package cn.telling.rmi; /** * * @ClassName: RealObject TODO * @author xingle * @date 2015-9-29 上午10:52:49 */ public class RealObject extends AbstractObject { /** * * @Description: TODO * @author xingle * @data 2015-9-29 上午10:53:05 */ @Override public void operation() { // 一些操作 System.out.println("一些操作"); } }
代理对象角色
package cn.telling.rmi; /** * * @ClassName: ProxyObject * TODO * @author xingle * @date 2015-9-29 上午10:54:31 */ public class ProxyObject extends AbstractObject{ RealObject realObject = new RealObject(); /** * * @Description: TODO * @author xingle * @data 2015-9-29 上午10:54:43 */ @Override public void operation() { System.out.println("调用目标对象 before 操作"); realObject.operation(); System.out.println("调用目标对象 after 操作"); } }
客户端
package cn.telling.rmi; /** * * @ClassName: Client * TODO * @author xingle * @date 2015-9-29 上午10:57:54 */ public class Client { public static void main(String[] args){ AbstractObject obj = new ProxyObject(); obj.operation(); } }
执行结果: