AOP是一种装饰模式吗?

时间:2011-11-13 14:09:55

标签: design-patterns language-agnostic aop decorator

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

这是实际问题。

  

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

4 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:10)

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

答案 2 :(得分:6)

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

对我而言,最大的区别在于它的实施方式以及如何应用。

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

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

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

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

答案 3 :(得分:1)

此外,支持横切关注拦截的依赖注入框架基本上应用了引擎盖下的装饰模式。将方面编织到中间语言中的框架(如在.Net MSIL中)不依赖于接口或继承,与装饰器模式不同。