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

时间:2011-12-27 13:17:03

标签: java design-patterns decorator

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

3 个答案:

答案 0 :(得分:9)

可以,但你需要知道类型才能实际调用方法(假设没有反射等),如果它不符合你输的类型。

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

您可以创建一个额外的界面,但您需要知道它已存在,以便您可以检查它(instanceof),或询问该类以检查特定的签名(反射)。 / p>

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

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