小编典典

代理模式和装饰器模式的区别

all

您能否给出任何好的解释 ProxyDecorator 之间的区别是什么?

我看到的主要区别是,当我们假设 代理 使用 组合装饰器 使用 聚合 时,似乎很清楚通过使用多个(一个或多个) 装饰器
,您可以修改/添加功能到预先存在的实例(装饰),而 代理 有自己的代理类的内部实例,并委托给它添加一些附加功能(代理行为)。

问题是 -使用聚合创建的 Proxy 仍然是 Proxy 还是 Decorator ?是否允许(根据 GoF 模式中的定义)创建具有聚合的
代理?


阅读 61

收藏
2022-07-31

共1个答案

小编典典

这是来自 GoF 的直接引用(第 216 页)。

尽管装饰器可以具有与代理类似的实现,但装饰器有不同的用途。装饰器向对象添加一个或多个职责,而代理控制对对象的访问。

代理的实现程度各不相同,就像装饰器一样。保护代理的实现可能与装饰器完全一样。另一方面,远程代理将不包含对其真实主体的直接引用,而仅包含间接引用,例如“主机
ID 和主机上的本地地址”。虚拟代理将从文件名等间接引用开始,但最终将获得并使用直接引用。

流行的答案表明代理知道其委托的具体类型。从这句话我们可以看出,这并不总是正确的。

根据 GoF,Proxy 和 Decorator 的区别在于 Proxy 限制 了客户端。装饰器没有。代理可以通过控制对功能的访问来限制客户端的
操作 ;或者它可能会通过执行客户端不可见和未知的操作来限制客户端 知道的内容。 Decorator
做相反的事情:它以一种对客户可见的方式增强了它的委托所做的事情。

我们可以说 Proxy 是一个黑盒子,而 Decorator 是一个白盒子。

在对比 Proxy 和 Decorator 时,wrapper 和 delegate
之间的组合关系是错误的关系,因为组合是这两种模式的共同特征。包装器和客户端之间的关系是区分这两种模式的原因。

  • 装饰者通知并授权其客户。
  • 代理限制和剥夺其客户的权力。
2022-07-31