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中具有特定于Decorator方法的Decorator模式_Java_Design Patterns_Decorator - Fatal编程技术网

Java中具有特定于Decorator方法的Decorator模式

Java中具有特定于Decorator方法的Decorator模式,java,design-patterns,decorator,Java,Design Patterns,Decorator,使用Wikipedia()上显示的咖啡装饰器示例,一个人如何能够拥有只有装饰器拥有的方法,例如,牛奶装饰器可以拥有一个名为“fatContent”的方法。对于这种类型的设计模式,这可能吗?如果没有,我可以使用什么样的模式来实现这一点 装饰器可以有任意数量的特定方法。除了实现装饰接口之外,还可以引入装饰器实现的装饰器特定接口 但是,必须有人知道这些方法的存在,因此装饰器必须在内部调用该方法,调用者必须知道它使用装饰器而不是装饰对象(您可以使用instanceof)进行测试,或者使用反射来检查这些方

使用Wikipedia()上显示的咖啡装饰器示例,一个人如何能够拥有只有装饰器拥有的方法,例如,牛奶装饰器可以拥有一个名为“fatContent”的方法。对于这种类型的设计模式,这可能吗?如果没有,我可以使用什么样的模式来实现这一点

装饰器可以有任意数量的特定方法。除了实现装饰接口之外,还可以引入装饰器实现的装饰器特定接口

但是,必须有人知道这些方法的存在,因此装饰器必须在内部调用该方法,调用者必须知道它使用装饰器而不是装饰对象(您可以使用
instanceof
)进行测试,或者使用反射来检查这些方法。

您可以,但是如果方法与您正在传递的类型不匹配,那么您需要知道该类型,以便实际调用该方法(假设没有反射等)

类型决定编译时已知的内容:如果
CoffeeDecorater
不包含
fatContent
签名,则接收
coffeedecorator
的任何人都不知道该方法存在

您可以创建一个额外的接口,但您需要知道它的存在以便可以检查它(
instanceof
),或者询问类以检查特定的签名(反射)


Java要么在编译时知道某个方法存在,要么在运行时检查它。

Decorator模式按定义不允许添加接口中定义的方法以外的方法。实际上,您始终可以向任何类添加方法,但一旦这些方法未在实现接口中定义,客户端就无法使用此接口调用它们


解决问题的简单方法是定义几个接口,例如咖啡和牛奶。然后您可以定义类
Capuchino
,该类实现两个接口并可能包含两个实例:
simplecofe
FoamedMilk
。但是这个解决方案看起来更像是装饰和外观的结合

我不知道那种设计模式。“老实说,我不喜欢它。”维基百科的咖啡例子是从书中摘录的。但它只包含一小部分,没有进一步解释。我推荐这堂课来全面了解这个图案。@MartijnCourteaux Decorator?!这是最有用的模式之一,GoF书中装饰器模式的IMO.UML特别显示了一个具体的装饰器添加了一个接口中未定义的方法。这个答案的第一句话显然是错的。