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

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

它有如下的类图

在此处输入图像描述

Proxy类直接引用具体的Subject。

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

在此处输入图像描述

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

在此处输入图像描述

这都是关于意图的。 从function上讲,它们是等价的,但装饰者的意思是动态地向对象添加function,而代理只是控制对目标对象的访问而不向其添加任何附加function。

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

因此,从概念上看,在您的示例中,您仍然在处理代理。

是。 如果你看一下结构,那么DecoratorProxy都是一样的。 只有意图是不同的。

装饰:

  1. 在运行时向对象添加行为 。 inheritance是实现此function的关键,这是此模式的优点和缺点。
  2. 它修改了界面的行为。

例如(with chaining):与InputStreamOutputStream接口相关的java.io包类

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

后果

  1. 装饰更方便在运行时向对象添加function而不是整个类。 通过装饰,还可以动态地移除添加的function。
  2. 装饰在运行时为对象添加function,这将使调试系统function更难。

代理:

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

例如: java.rmi包类

关键要点:

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

有用的链接:

来自wikiepdia的Decorator_pattern

来自制作的装饰师

来自oodesign的装饰图案

来自维基百科的Proxy_pattern

来源制造的代理

来自oodesign的代理模式