代理和装饰模式之间的差异

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理和装饰模式之间的差异相关的知识,希望对你有一定的参考价值。

你能解释一下Proxy和Decorator之间的区别吗?

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

问题是 - 使用聚合创建的代理仍然是代理还是装饰器?是否允许(通过GoF模式中的定义)创建具有聚合的代理?

答案

Decorator Pattern专注于向对象动态添加函数,而Proxy Pattern则专注于控制对对象的访问。

编辑:-

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

另一答案

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

装饰者总是通过其委托人。代理可能会自己创建它,或者他可能会注入它。

但是代理总是知道委托者的(更具体)类型。换句话说,Proxy及其代理人将具有相同的基本类型,但Proxy指向某些派生类型。装饰器指向其自己的基本类型。因此,不同之处在于有关被委派者类型的编译时信息。

在动态语言中,如果被委托者被注入并且碰巧具有相同的接口,则没有区别。

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

另一答案

装饰器获取装饰对象的引用(通常通过构造函数),而Proxy负责自己做。

代理可能根本不实例化包装对象(如果没有使用对象字段/ getter,这样可以防止对DB进行不必要的访问),而Decorator总是保存到实际包装实例的链接。

框架通常使用代理来添加安全性或缓存/ lazing并由框架构建(而不是由常规开发人员自己构建)。

Decorator通常用于通过开发人员本身基于接口而不是实际类向旧类或旧类添加新行为(因此它适用于各种接口实例,Proxy是围绕具体类)。

另一答案

主要差异:

  1. 代理提供相同的接口。 Decorator提供增强的界面。
  2. 装饰器和代理具有不同的目的但结构相似。两者都描述了如何为另一个对象提供间接级别,并且实现保持对它们转发请求的对象的引用。
  3. 装饰器可以被视为只有一个组件的简并Composite。但是,Decorator增加了额外的职责 - 它不适用于对象聚合。
  4. Decorator支持递归合成
  5. Decorator类声明与LCD(最低类分母)接口的组合关系,并且此数据成员在其构造函数中初始化。
  6. 使用Proxy进行延迟初始化,通过缓存对象并控制对客户端/调用者的访问来提高性能

Sourcemaking文章以优秀的方式引用了异同。

相关的SE问题/链接:

When to Use the Decorator Pattern?

What is the exact difference between Adapter and Proxy patterns?

另一答案

代理和装饰器的目的不同,他们关注内部实现。代理用于使用远程,跨进程或跨网络对象,就像它是本地对象一样。 Decorator用于向原始界面添加新行为。

虽然两种模式在结构上相似,但Proxy的大部分复杂性在于确保与源对象的正确通信。另一方面,Decorator专注于添加行为的实现。

以上是关于代理和装饰模式之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

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

代理模式、装饰者模式

设计模式——代理模式与装饰模式的异同

设计模式-装饰模式JAVA实现

装饰器、包装器和适配器模式之间有啥区别?

Python笔记 · 函数装饰器(Decorators)