装饰器设计模式不明确

Decorator Design Pattern Ambigous

以简单的class图为例

我的问题是 为什么 我们需要 OptionalWrapperOptionalOneOptionalTwoOptionalThree 实现 Interface 还不够吗,因为我们只需要 Interface 装饰器中的对象类型 classes.

OptionalWrapper 是您添加对您正在装饰的 class 的引用的地方,并将其所有方法重定向到该实例。如果您没有 OptionalWrapper,那么您需要在其每个子 class 中重复此代码。在给定的图表中,每个子classes 只需要覆盖它们应该修改的行为。

一个更具体的例子:你想添加异常处理。您可以在 OptionalWrapper 中执行一次并完成,或者您可以在三个子 class 中的每一个中实现它(以及您拥有的每个新的 class 实现接口)。

1) 在您的示例中,如果您决定在所有装饰器 OptionalOneOptionalTwoOptionalThree 中添加新行为,那么您将在 [=13] 中添加一个新方法=] 但这会影响 CoreFunactionality。所以要分开这个你需要一个 interface/abstract class OptionalWrapper.

2) 所有的装饰器只需要处理OptionalWrapper,不用管它装饰的是什么实例。

这里可选的包装器是您的装饰器class,在大多数情况下它是抽象的。它增强了对象的职责。如果你在你的接口中添加了一些不需要在你的可选 classes(optional1,optiona2 等)中实现的功能,你将需要一个抽象的可选包装器。