装饰器设计模式不明确
Decorator Design Pattern Ambigous
以简单的class图为例
我的问题是 为什么 我们需要 OptionalWrapper
? OptionalOne
、OptionalTwo
和 OptionalThree
实现 Interface
还不够吗,因为我们只需要 Interface
装饰器中的对象类型 classes.
OptionalWrapper
是您添加对您正在装饰的 class 的引用的地方,并将其所有方法重定向到该实例。如果您没有 OptionalWrapper
,那么您需要在其每个子 class 中重复此代码。在给定的图表中,每个子classes 只需要覆盖它们应该修改的行为。
一个更具体的例子:你想添加异常处理。您可以在 OptionalWrapper 中执行一次并完成,或者您可以在三个子 class 中的每一个中实现它(以及您拥有的每个新的 class 实现接口)。
1) 在您的示例中,如果您决定在所有装饰器 OptionalOne
、OptionalTwo
和 OptionalThree
中添加新行为,那么您将在 [=13] 中添加一个新方法=] 但这会影响 CoreFunactionality
。所以要分开这个你需要一个 interface/abstract class OptionalWrapper
.
2) 所有的装饰器只需要处理OptionalWrapper
,不用管它装饰的是什么实例。
这里可选的包装器是您的装饰器class,在大多数情况下它是抽象的。它增强了对象的职责。如果你在你的接口中添加了一些不需要在你的可选 classes(optional1,optiona2 等)中实现的功能,你将需要一个抽象的可选包装器。
以简单的class图为例
我的问题是 为什么 我们需要 OptionalWrapper
? OptionalOne
、OptionalTwo
和 OptionalThree
实现 Interface
还不够吗,因为我们只需要 Interface
装饰器中的对象类型 classes.
OptionalWrapper
是您添加对您正在装饰的 class 的引用的地方,并将其所有方法重定向到该实例。如果您没有 OptionalWrapper
,那么您需要在其每个子 class 中重复此代码。在给定的图表中,每个子classes 只需要覆盖它们应该修改的行为。
一个更具体的例子:你想添加异常处理。您可以在 OptionalWrapper 中执行一次并完成,或者您可以在三个子 class 中的每一个中实现它(以及您拥有的每个新的 class 实现接口)。
1) 在您的示例中,如果您决定在所有装饰器 OptionalOne
、OptionalTwo
和 OptionalThree
中添加新行为,那么您将在 [=13] 中添加一个新方法=] 但这会影响 CoreFunactionality
。所以要分开这个你需要一个 interface/abstract class OptionalWrapper
.
2) 所有的装饰器只需要处理OptionalWrapper
,不用管它装饰的是什么实例。
这里可选的包装器是您的装饰器class,在大多数情况下它是抽象的。它增强了对象的职责。如果你在你的接口中添加了一些不需要在你的可选 classes(optional1,optiona2 等)中实现的功能,你将需要一个抽象的可选包装器。