我在采访中被问到了这个问题。我清楚地知道什么是装饰器模式以及如何使用它。但是我在面试中无法思考这个问题。
这是实际提出的问题。
AOP是装饰器样式的变体吗? AOP实施与商标装饰器模式有何不同?
[我会说AOP (Aspect Oriented Programming)本身不是一种模式(因此不是我的POV中的一种装饰器模式)...可以通过一个或多个模式(包括使用decorator pattern)来实现其实现。 .. AOP是programming paradigm恕我直言-其他范例例如OOP,函数式编程或过程式编程...
我总体上同意Yahia。请注意,尽管各方面添加并可能修改了现有功能,但它们通常应用于整个方法或类,而不是单个实例。
我会说,是的,AOP是装饰器模式的实现。
对我来说,最大的区别在于它的实施方式和应用方式。
传统装饰器通常是将显式装饰的对象合成或由基础对象的扩展点启用的对象。
[AOP通常以更“声明式”的方式指定-传统修饰符通常是主线代码的一部分(与注解,配置文件或某种形式的已配置字节码操作系统相对)。
传统装饰器通常仅适用于特定的类或接口,并且通常在实例级别应用。 AOP(通常)可以在“基本级别”上将功能包装在基本上任意的代码周围-行为将扩展到任何方面应用到的all实例。这就是它可以满足其“跨领域功能”的要求的原因:它不一定限于装饰器那样小的范围。
但是,这取决于基础语言-有些语言比其他语言更灵活。上面的内容更多地适用于“静态”语言(例如Java),而不适用于像Ruby这样的语言,在Ruby中,看起来像传统装饰器的语言可以应用于单个实例,或者成为类定义的一部分。
此外,支持跨领域关注点拦截的依赖项注入框架基本上在引擎盖下应用了装饰器模式。与装饰器模式不同,将方面编织成中间语言的框架(如.Net MSIL中的框架)不依赖于接口或继承。