如果在代理模式中我们有接口而不是实际的具体主题在Proxy类中它等同于Decorator模式

时间:2016-03-28 16:40:34

标签: java design-patterns decorator proxy-pattern

代理模式在执行一些额外处理之后将请求委托给Real主题,例如,如果需要处理请求,则应用检查可能是某些凭据检查。

它有如下的类图

enter image description here

代理类具有对具体主题的直接引用。

Decorator Pattern丰富了组件的行为[就像代理它还做了一些额外的处理并将操作委托给真实组件]。此模式的类图类似于代理模式,唯一不同的是它具有对组件接口的引用。

enter image description here

在Proxy类中具有具体的实际主题使得单元测试变得困难,因为类应该仅依赖于接口而不是实现。我的问题是,如果代理模式也有对Real主题公开的接口的引用,那么它将等同于Decorator模式。在这种情况下,代理模式的类图也将如下所示

enter image description here

2 个答案:

答案 0 :(得分:4)

关于意图的全部内容。在功能上,它们是等价的,但装饰者的意思是动态地向对象添加功能,而代理只是控制对目标对象的访问而不向其添加任何附加功能。

因此,代理的客户端需要与真实对象相同的结果,而装饰器的客户端将其留给装饰器,以便在将调用委托给目标之前和/或之后执行任何其他逻辑。

所以,从概念上讲,在你的例子中,你似乎还在处理代理。

答案 1 :(得分:1)

是。如果您查看结构,装饰器代理都是相同的。只有意图是不同的。

<强> 装饰:

  1. 在运行时向对象添加行为。继承是实现此功能的关键,这是该模式的优点和缺点。
  2. 它修改了界面的行为。
  3. e.g。 (带链接): java.io InputStream&amp;相关的包类OutputStream接口

    FileOutputStream fos1 = new FileOutputStream("data1.txt");  
    ObjectOutputStream out1 = new ObjectOutputStream(fos1);
    

    后果

    1. 装饰更方便在运行时向对象添加功能而不是整个类。通过装饰,还可以动态删除添加的功能。
    2. 装饰在运行时向对象添加功能,这将使调试系统功能更难。
    3. <强> 代理:

      1. 通过缓存对象并控制对客户端/调用者的访问,将其用于延迟初始化,性能改进。它可以提供替代行为或调用真实对象。在此过程中,它可能会创建新的Object。
      2. 与允许链接对象的Decorator不同,Proxy不允许链接。
      3. 例如: java.rmi 包类

        关键要点:

        1. 代理提供相同的界面。 Decorator 提供增强的界面。
        2. 装饰器代理具有不同的用途但结构相似。两者都描述了如何为另一个对象提供间接级别,并且这些实现保留了对它们转发请求的对象的引用。
        3. 有用的链接:

          来自wikiepdia的

          Decorator_pattern

          来自sourcemaking的

          decorator

          来自oodesign的

          decorator-pattern

          来自维基百科的

          Proxy_pattern

          来自sourcemaking的

          proxy

          来自oodesign的

          proxy-pattern