`

Proxy Pattern-代理模式

阅读更多

作用:为对象提供一种代理以控制对这个对象的访问。

示例-代理模式:

名称

说明

Printer

表示命名的打印机类(本人)

Printable

PrinterPrinterProxy共享的接口

PrinterProxy

表示命名的打印机的类(代理)

Main

测试类

 类图查看图片附件:类图-Proxy_1

//------------------------------------------ Printable---------------------------------------------------------------

package proxy;

public interface Printable{

    public abstract void setPrinterName(String name);//命名

    public abstract String getPrinterName();//取得名称

    public abstract void print(String string);    //输出字符串(打印)

}

//------------------------------------------ Printer---------------------------------------------------------------

package proxy;

public class Printer implements Printable{

    private String name;

    public Printer(){

       heavyJob("正在产生Printer的实例对象");

    }

    public Printer(String name){

        this.name = name;

       heavyJob("正在产生Printer的对象实例(" + name + ")");

    }

    public void setPrinterName(String name){

       this.name = name;

    }

    public String getPrinterName(){

       return name;

    }

    public void print(String String){

       System.out.println("==="+ name + " ===");

       System.out.println(String);

    }

  private void heavyJob(String msg){

        System.out.print(msg);

        for(int i = 0; i < 10; i++){

               try{

                  Thread.sleep(500);  

               } catch (InterruptedException e) {

               }

              

System.out.print(".");

        }

        System.out.println("完成");

  }

} //------------------------------------------ PrinterProxy ---------------------------------------------------------------

package proxy;

public class PrinterProxy implements Printable {

    private String name;//命名

    private Printer real;//"本人"

    public PrinterProxy(){

    }

    public PrinterProxy(String name){//构造函数

       this.name = name;

    }  

    public synchronized void setPrinterName(String name){//命名

           if (real != null){

              real.setPrinterName(name);//本人也要命名

           }

           this.name = name;

    }

    public String getPrinterName(){//取得名称

       return name; 

    }

    public void print(String String){//输出

           realize();

           real.print(String);

    }

    private synchronized void realize(){ //产生本人

       if (real == null) {

           real = new Printer(name);

       }  

    }

   

}

//------------------------------------------测试类---------------------------------------------------------------

package proxy;

public class Main{

    public static void main(String[] args){

       Printable p = new PrinterProxy("Alice");

       System.out.println("现在的名称是" + p.getPrinterName() + ".");

       p.setPrinterName("BOb");

       System.out.println("现在的名称是" + p.getPrinterName() + ".");

       p.print("Hello,CCF~~"); 

    }

}

解析:

PrinterProxy类和Printer类是一视同仁的,所以例外定义了Printable接口。设置名称(getName())、获得名称(setName())这样简单的任务就又代理来完成,需要打印(print),这样费时的任务就又本人来做,其中heavyJob()就模拟了这个费时性。

所谓“代理”,就是代替那个“本人”来做事,即为:本人将不需要自己做的事情外包出去,但是,这个代理能力范围有限,如果超出能力范围,就由本人自己来完成任务。

以下是Adapter Pattern模式解析

代理模式参与者

Subject-主体)参与者规定对Proxy参与者和RealSubject参与者一视同仁的接口。因为已经有Subject参与者所以Client参与者就不需要去注意Proxy参与者与RealSubject参与者之间的差异,就如实例中的Printable接口一样。

Proxy-(代理)参与者,Proxy会尽量处理Client参与者的要求,当自己无法单独处理时,就会将工作交给RealSubject参与者。

RealSubject-(实际主体)参与者,就是“本人”角色,它和Proxy都实现了Subject参与者规定的接口

Client-接口调用参与者,在实例中是测试类充当了这个角色。

协作过程:代理根据其种类,在适当的时候向RealSubject转发请求。

代理模式实现类图见图片附件:类图-Proxy_2

模式分析:

代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

适用性:

<1> Remote Proxy可以隐藏一个对象存在于不同地址空间的事实

<2> Virtual Proxy可以进行最优化,例如根据要求创建对象,这样利用代理提高了处理速度。     

<3> Protection proxy等允许在访问一个对象时有一些附件的内务处理。

比较:

Adaper Pattern的功能是连接两个接口有差异的对象,Proxy PatternProxy参与者和RealSubject参与者两者的接口并没有差异(也即具备穿透性)

Decorator PatternProxy Pattern的实现模式很相似,但是目的却不同。前者是为了新增功能,后者则是注重代替“本人”进行作业,以减少“本人”存取操作,或者延迟“本人”实例化时间。

  • 大小: 40.4 KB
  • 大小: 30 KB
分享到:
评论

相关推荐

    Proxy Pattern 代理模式

    Proxy Pattern 代理模式 采用JAVA实现,可以下载看看。

    design-pattern-java.pdf

    实现对象的复用——享元模式(二) 实现对象的复用——享元模式(三) 实现对象的复用——享元模式(四) 实现对象的复用——享元模式(五) 代理模式-Proxy Pattern 设计模式之代理模式(一) 设计模式之代理模式...

    Android设计模式之代理模式(Proxy Pattern)

    Android设计模式之代理模式(Proxy Pattern)

    代理模式 Proxy Pattern

    在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    java 代理模式实现代码及设计详解:动态代理模式、静态代理模式

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

    24种设计模式与6大设计原则

    代理模式[PROXY PATTERN] 单例模式[SINGLETON PATTERN] 多例模式[MULTITION PATTERN] 工厂方法模式[FACTORY METHOD PATTERN] 抽象工厂模式[ABSTRACT FACTORY PATTERN] 门面模式[FACADE PATTERN] 适配器模式[ADAPTER ...

    设计模式 之 “代理模式[Proxy Pattern]”

    NULL 博文链接:https://lym6520.iteye.com/blog/692896

    用Java实现23种设计模式

    代理模式(Proxy Pattern) 3. 行为型模式 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器...

    Java 动态代理.md

    代理模式(Proxy Pattern)是 23 种设计模式的一种,属于结构型模式。他指的是一个对象本身不做实际的操作,而是通过其他对象来得到自己想要的结果。这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作,...

    33种JAVA设计模式DEMO

    代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式...

    JAVA设计模式.rar

    代理模式【PROXY PATTERN】 单例模式【SINGLETON PATTERN】  多例模式【MULTITION PATTERN】  工厂方法模式【FACTORY METHOD PATTERN】 抽象工厂模式【ABSTRACT FACTORY PATTERN】 门面模式【FACADE ...

    设计模式PPT

     代理模式(Proxy Pattern) 行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式:  责任链模式(Chain of Responsibility Pattern)  命令模式(Command Pattern)  解释...

    C#设计模式_设计模式_C#_

    代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18....

    C#设计模式(23种设计模式)

    代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 行为型: 16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter ...

    单例模式源码java-DesignPattern:在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在

    单例模式源码java DesignPattern 在个人自学阶段的23种...代理模式 1.3 行为型模式 Visitor--------&gt;访问者模式 Template--------&gt;模板模式 Strategy--------&gt;策略模式 State--------&gt;状态模式 Observer-

    Java 代理(proxy)模式

    代理模式(Proxy Pattern)  代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间...

    适配器模式和代理模式的区别

    即Proxy Pattern,23种常用的面向对象软件的设计模式之一。(设计模式的说法源自《设计模式》一书,原名《Design Patterns: Elements of Reusable Object-Oriented Software》。1995年出版,出版社:Addison Wesly ...

    proxy-pattern:带有在线库的代理模式示例

    代理模式 在线图书馆的代理模式样本

Global site tag (gtag.js) - Google Analytics