6

代理模式在进行一些额外的处理后将请求委托给真实主体,例如应用检查是否需要处理请求,可能是基于一些凭证检查。

它有如下的类图

在此处输入图像描述

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

装饰器模式丰富了组件的行为[像代理一样,它也做了一些额外的处理并将操作委托给真正的组件]。该模式的类图类似于代理模式,唯一的区别是它引用了组件的接口。

在此处输入图像描述

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

在此处输入图像描述

4

2 回答 2

5

这一切都与意图有关。在功能上,它们是等价的,但装饰器的目的是动态地向对象添加特性,而代理只是控制对目标对象的访问,而不向它添加任何额外的特性。

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

因此,从概念上讲,在您的示例中,您似乎仍在处理代理。

于 2016-03-28T17:15:51.600 回答
2

是的。如果您查看结构,那么DecoratorProxy将是相同的。只是意图不同。

装饰师:

  1. 在运行时向对象添加行为。继承是实现这一功能的关键,这既是这种模式的优点也是缺点。
  2. 它修改接口的行为。

例如(带有链接):与&接口相关的java.io包类InputStreamOutputStream

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

结果

  1. 装饰更便于在运行时向对象而不是整个类添加功能。通过装饰,还可以动态删除添加的功能。
  2. 装饰在运行时向对象添加功能,这会使调试系统功能更加困难。

代理人:

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

例如:java.rmi包类

关键要点:

  1. 代理提供相同的接口。装饰器提供了一个增强的接口。
  2. DecoratorProxy的用途不同,但结构相似。两者都描述了如何为另一个对象提供一定程度的间接性,并且实现保持对它们转发请求的对象的引用。

有用的链接:

来自维基百科的Decorator_pattern

来自 sourcemaking 的装饰师

oodesign的装饰器模式

来自维基百科的Proxy_pattern

来自sourcemaking的代理

oodesign的代理模式

于 2016-04-07T12:38:16.427 回答