设计模式 11 —— 代理模式 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式(迭代器) 设计模式 4 —— 迭代器和组合模式(组合) 设计模式 5

设计模式目录:html

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

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

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

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

设计模式 5 —— 工厂模式post

设计模式 6 —— 单件模式学习

设计模式 7 —— 命令模式url

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

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

设计模式 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设计模式之——代理模式

相关文章
相关标签/搜索