因此,修饰器模式允许您动态地将行为添加到类中,对吗?但是,装饰器必须从获得行为的类的基类继承,或者必须实现它的一个接口。事实上,我记得的所有例子都有一个暴露的函数,所以应用装饰器效果很好,但是如果你想让装饰器添加行为,比如记录到不具有相同接口的各种类 - 它将不起作用。我在这里错过了什么吗?这是暗示所有我想登录的类应该被包装在同一个接口中,就像命令或其他东西一样?修饰器模式的正确应用
例如
class A
{
whatever();
idontknow();
}
class B
{
bananas();
}
我不能让一个装饰来记录这些类的函数的调用,因为它们是不同的。
谢谢,但在那个例子中,装饰器仍然需要实现一个特定的方法吗?在考虑你的例子之后,可能有一种方法可以使用反射来制作装饰器(你可以使用反射来做任何事情),而不必实现特定的方法,但是看起来很不雅观并且反设计模式化... – Ford
装饰器模式是一个明确定义的概念:通过包装对象来增强功能,同时向客户端提供相同的接口:http://stackoverflow.com/questions/12379848/decorator-design-pattern-vs-inheritance/12379948#12379948。你所描述的不是装饰者模式(这并不能减少它的价值)。通过拦截示例,您不需要重新实现该方法。您实现了一个方法,然后将其应用于标记了该属性的所有其他方法。请检查代码示例。 –
在这个例子中,拦截器必须实现IService或者它不起作用......但我想我得到了这个想法 - 在实际的IoC框架中,它会使用反射技巧来将拦截器应用于任何具有自定义属性的方法,根本不涉及多态。 – Ford