0

所以装饰器模式允许你动态地向一个类添加行为,对吧?但是,装饰器必须从获得行为的类的基类继承,或者必须实现其接口之一。事实上,我能回忆起的所有示例都有一个公开的函数,因此应用装饰器效果很好,但是如果你想让装饰器添加行为,例如记录到没有相同接口的各种类 - 它不会工作. 我在这里错过了什么吗?这是否暗示我想要记录的所有类都应该包装在同一个接口中,比如命令或其他东西?

例如

class A
{
    whatever();
    idontknow();
}

class B
{
    bananas();
}

我无法制作装饰器来记录这些类中函数的调用,因为它们不同。

4

2 回答 2

2

我相信您可能误解了装饰器模式,并且从您对问题的解释来看,您似乎确实需要其他东西:您需要实现横切关注点 - 一些可以应用于完全不相关行为的常见功能。例如,您想围绕不相关的功能进行日志记录。

这称为面向方面编程,简称 AOP。

有一些工具可以让你拦截对方法的调用,并用所需的行为来增强它们,即你可以在方法调用周围添加日志记录,或者确保用户有足够的权限来执行调用等。其中一些工具在.NET 通过修改 IL 来实现这一点,而其他人则在运行时动态包装类型。

我在这个答案这里也提供了一个例子。

于 2013-04-14T12:14:20.250 回答
1

装饰器只需要像这样“模仿”基类:

Class ADecorator : A {
  ADecorator(A a) { /* etc */ }

  void whatever();
  void idontknow();
}

class BDecorator1 : B {
  BDecorator1(B b) { /* etc */ }

  void bananas();
}

class BDecorator2 : B {
  BDecorator2(B b) { /* etc */ }

  void bananas();
}

并在其构造函数中接受基类的实例。

于 2013-04-14T02:45:27.723 回答