设计模式 11 —— 代理模式

设计模式目录:

设计模式 1 ——观察者模式

设计模式 2 —— 装饰者模式 

设计模式 3 —— 迭代器和组合模式(迭代器)

设计模式 4 —— 迭代器和组合模式(组合)

设计模式 5 —— 工厂模式

设计模式 6 —— 单件模式

设计模式 7 —— 命令模式

设计模式 8 —— 适配器和外观模式

设计模式 9 —— 模板方法模式

设计模式 10 —— 状态模式

设计模式 11 —— 代理模式

参考

代理模式为另一个对象提供一个替身或占位符以控制这个对象的访问。

使用代理模式创建代表,让代表对象控制某些对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或者需要安全控制的对象。

几种代理控制访问的方式:

  • 远程代理控制访问远程对象(见上篇博客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();
    }

}

执行结果:

 


参考:

  1. 【设计模式】学习笔记15:代理模式(Proxy Pattern)

  2. 【设计模式】学习笔记16:代理模式之虚拟代理(实现CD封面加载器)

  3. 《JAVA与模式》之代理模式

  4. 【设计模式】学习笔记17:代理模式之保护代理与Java反射
  5. java设计模式之——代理模式

原文地址:https://www.cnblogs.com/xingele0917/p/4845727.html