AOP是一种装饰模式吗?

Vin*_*C M 27 language-agnostic aop design-patterns decorator

我在接受采访时被问到这个问题.我清楚地知道装饰器模式是什么以及如何使用它.但我在采访中无法思考这个问题.

这是实际问题.

AOP是装饰模式的变体吗?AOP实施与商标装饰模式有何不同?

Yah*_*hia 24

我会说AOP(面向方面​​编程)本身不是一个模式(因此不是我的POV中的一种装饰模式)......它的实现可以通过一个或多个模式完成(包括使用装饰模式). .. AOP是一种编程范例恕我直言 - 其他范例是例如OOP,函数式编程或程序式编程......

  • AOP实现主要使用Proxy和Decorator的混合. (6认同)
  • AOP的语义在语言层面上运行:添加关键字、改变控制流等;而 Decorator 完全在 OOP 语义内运行(只是重写虚拟方法)。这使得 Decorator 成为一种模式,而 AOP 则有资格成为“语言扩展”。 (2认同)

Luc*_*ero 11

我同意Yahia的意见.请注意,虽然方面添加并可能修改现有功能,但它们通常应用于整个方法或类,而不是单个实例.

  • +1 强调“整个方法/类与单个实例”点:-) (2认同)

Dav*_*ton 6

我想在某种程度上说,是的,AOP是装饰器模式的一个实现.

对我来说,最大的不同之处在于它的实施方式以及它的应用方式.

传统装饰器通常是对象,它们要么显式地组合要装饰的对象,要么由底层对象的扩展点启用.

AOP通常以更"声明"的方式指定 - 传统的装饰器是主线代码的一般部分.

传统装饰器通常仅适用于特定类或接口,并且通常在实例级别应用.AOP(通常)可以在"基础级别"围绕基本上任意的代码包装功能 - 行为将扩展到应用方面的所有实例.这使它能够满足其"交叉功能"的要求:它不一定限于像装饰者那样狭窄的范围.

这取决于基础语言,但有些语言比其他语言更灵活.以上内容更多地适用于"静态"语言(例如Java),而不是像Ruby这样的语言,其中看起来像传统装饰器的东西可以应用于单个实例,或者成为类定义的一部分.