您能否给出任何好的解释 Proxy 和 Decorator 之间的区别是什么?
我看到的主要区别是,当我们假设 代理 使用 组合 而 装饰器 使用 聚合 时,似乎很清楚通过使用多个(一个或多个) 装饰器 ,您可以修改/添加功能到预先存在的实例(装饰),而 代理 有自己的代理类的内部实例,并委托给它添加一些附加功能(代理行为)。
问题是 -使用聚合创建的 Proxy 仍然是 Proxy 还是 Decorator ?是否允许(根据 GoF 模式中的定义)创建具有聚合的 代理?
这是来自 GoF 的直接引用(第 216 页)。
尽管装饰器可以具有与代理类似的实现,但装饰器有不同的用途。装饰器向对象添加一个或多个职责,而代理控制对对象的访问。 代理的实现程度各不相同,就像装饰器一样。保护代理的实现可能与装饰器完全一样。另一方面,远程代理将不包含对其真实主体的直接引用,而仅包含间接引用,例如“主机 ID 和主机上的本地地址”。虚拟代理将从文件名等间接引用开始,但最终将获得并使用直接引用。
尽管装饰器可以具有与代理类似的实现,但装饰器有不同的用途。装饰器向对象添加一个或多个职责,而代理控制对对象的访问。
代理的实现程度各不相同,就像装饰器一样。保护代理的实现可能与装饰器完全一样。另一方面,远程代理将不包含对其真实主体的直接引用,而仅包含间接引用,例如“主机 ID 和主机上的本地地址”。虚拟代理将从文件名等间接引用开始,但最终将获得并使用直接引用。
流行的答案表明代理知道其委托的具体类型。从这句话我们可以看出,这并不总是正确的。
根据 GoF,Proxy 和 Decorator 的区别在于 Proxy 限制 了客户端。装饰器没有。代理可以通过控制对功能的访问来限制客户端的 操作 ;或者它可能会通过执行客户端不可见和未知的操作来限制客户端 知道的内容。 Decorator 做相反的事情:它以一种对客户可见的方式增强了它的委托所做的事情。
我们可以说 Proxy 是一个黑盒子,而 Decorator 是一个白盒子。
在对比 Proxy 和 Decorator 时,wrapper 和 delegate 之间的组合关系是错误的关系,因为组合是这两种模式的共同特征。包装器和客户端之间的关系是区分这两种模式的原因。