代理和装饰模式之间的区别

你能给一个很好的解释什么是代理装饰之间的区别?

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

问题是 – 使用聚合创build的代理代理还是装饰器 ? 是否允许(按照GoF模式定义)使用聚合创build代理

Decorator模式着重于dynamic添加函数到一个对象,而代理模式着重于控制对一个对象的访问。

编辑:-

代理和真实主体之间的关系通常是在编译时设置的, Proxy以某种方式实例化,而Decorator在运行时分配给主体,只知道主体的接口。

接受的答案是不完全正确的。 真正的区别不是所有权(构成与聚合),而是types信息。

装饰总是通过它的代表。 代理 可能自己创build它,或者他可能会注入它。

但是一个代理人 总是知道(更)特定types的代理人。 换句话说, 代理服务器和它的代理人将具有相同的基本types,但是代理指向一些派生types。 装饰者指向自己的基础types。 因此,不同之处在于关于委托人types的编译时信息。

在dynamic语言中,如果被调用者被注入并恰好具有相同的接口,那么没有区别。

您的问题的答案是“是”。

装饰者获取装饰对象的引用(通常通过构造函数),而代理负责自己做这件事。

代理可能不会实例化包装对象(就像这样做,如果没有使用对象字段/获取器,则不要使用ORM来防止不必要的数据库访问),而装饰器总是保持链接到实际包装的实例。

代理通常被框架用来增加安全或caching/价格,并由框架构build(而不是由普通开发人员本身)。

装饰者通常用于基于接口而不是实际的类(所以它在广泛的接口实例上工作, Proxy围绕具体的类)在开发者自己的旧类或旧类上添加新的行为。

主要区别:

  1. 代理提供相同的接口。 装饰者提供了一个增强的界面。
  2. 装饰者代理人有不同的目的,但类似的结构。 两者都描述了如何向另一个对象提供间接级别,并且这些实现保留了对它们转发请求的对象的引用。
  3. 装饰者可以被看作只有一个组件的退化组合。 然而,装饰者增加了额外的责任 – 它不适用于对象聚合。
  4. 装饰者支持recursion组合
  5. Decorator类声明一个到LCD(最低类分母)接口的合成关系,并且这个数据成员在其构造函数中被初始化。
  6. 使用代理进行延迟初始化,通过caching对象并控制对客户端/调用者的访问来提高性能

引文分析以优秀的方式引用异同。

相关的SE问题/链接:

何时使用装饰模式?

适配器和代理模式之间的确切区别是什么?