装饰器模式与Java中的装饰器特定方法

Atr*_*rus 6 java design-patterns decorator

使用维基百科(http://en.wikipedia.org/wiki/Decorator_pattern)上显示的咖啡装饰器示例,如何能够拥有只有装饰者拥有的方法,例如,牛奶装饰者可能拥有的方法一个名为"fatContent"的方法.这种设计模式是否可以实现这一点?如果没有,我可以使用什么样的模式来实现这一目标?

Dav*_*ton 9

可以,但你需要知道类型才能实际调用方法(假设没有反射等),如果它与你传递的类型不匹配.

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

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

Java要么在编译时知道一个方法,要么在运行时检查它.


Ale*_*exR 3

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

解决您的问题的简单方法是定义多个接口,例如咖啡和牛奶。然后,您可以定义Capuchino实现两个接口并可能包含 2 个实例的类:SimpleCofeeFoamedMilk。但这个解决方案看起来更像是 Decorator 和 Facade 的结合。