Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 装饰设计模式模棱两可_Java_Design Patterns_Decorator - Fatal编程技术网

Java 装饰设计模式模棱两可

Java 装饰设计模式模棱两可,java,design-patterns,decorator,Java,Design Patterns,Decorator,让我们以简单类图为例 我的问题是为什么我们需要OptionalWrapper?OptionalOne、OptionalTwo和OptionalThree实现Interface,这还不够吗?因为我们只需要装饰器类中对象的Interface类型。OptionalWrapper就是向要装饰的类添加引用的地方,并将其所有方法重定向到该实例。如果没有OptionalWrapper,则需要在其每个子类中重复此代码。在给定的图中,每个子类只需覆盖它们应该修改的行为。一个更具体的示例:您想要添加异常处理。您可

让我们以简单类图为例


我的问题是为什么我们需要
OptionalWrapper
OptionalOne
OptionalTwo
OptionalThree
实现
Interface
,这还不够吗?因为我们只需要装饰器类中对象的
Interface
类型。

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

一个更具体的示例:您想要添加异常处理。您可以在OptionalWrapper中完成一次,也可以在三个子类(以及实现接口的每个新类)中实现它

1)在您的示例中,如果您决定在所有装饰器
OptionalOne
OptionalTwo
OptionalThree
中添加新行为,那么您将在
界面
中添加新方法,但这会影响
核心功能性
。因此,要将其分开,您需要另外一个接口/抽象类
OptionalWrapper


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

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

使用
OptionalWrapper
可以在类中注入依赖项。这样,您就可以在
OptionalWrapper
中更改实现细节,而无需更改
OptionalOne
OptionalTwo
OptionalThree
中的任何内容。所有OptionalOne/Two/Three类都将实现可能重复的
doThis()
OptionalWrapper
将不会实现
doThis()
。在OptionalWrapper中,我们不会将引用添加到您正在装饰的类中,而是将引用添加到OptionalOne/Two/Three类中…@Junaid如果接口有
doThis()以外的其他方法,该怎么办?是否要在所有子类中重复代码?因此1)
OptionalWrapper
只是为了可恢复性,对吗?2)它在装饰物品方面没有起到任何作用,对吗?@Junaid是的,这两个都是正确的
OptionalWrapper
只是公开了一组方法,这些方法调用
wrapee
实例上的相应方法。通过重写其中一些方法,可以在其子类中进行修饰。