使用维基百科(http://en.wikipedia.org/wiki/Decorator_pattern)上显示的咖啡装饰器示例,如何能够拥有只有装饰者拥有的方法,例如,牛奶装饰者可以拥有一个名为“fatContent”的方法”。这种设计模式是否可以实现这一点?如果没有,我可以使用什么样的模式来实现这一目标?
答案 0 :(得分:9)
你可以,但你需要知道类型才能实际调用方法(假设没有反射等),如果它不符合你输的类型。
类型确定编译时已知的内容:如果CoffeeDecorater
不包含fatContent
签名,则接收CoffeeDecoractor
的任何内容都不知道该方法是否存在。
您可以创建一个额外的界面,但您需要知道它已存在,以便您可以检查它(instanceof
),或询问该类以检查特定的签名(反射)。 / p>
Java要么在编译时知道一个方法,要么在运行时检查它。
答案 1 :(得分:4)
装饰器可以有任意数量的特定方法。除了实现修饰接口之外,您可以引入装饰器实现的装饰器特定接口。
但是,有人必须知道这些方法存在,因此装饰者必须在内部调用该方法,调用者必须知道它使用装饰器而不是装饰对象(您可以使用instanceof
进行测试)或使用反射来检查这些方法。
答案 2 :(得分:3)
根据定义,装饰器模式不允许添加除界面中定义的方法之外的方法。实际上,您总是可以向任何类添加方法,但是一旦这些方法未在实现接口中定义,客户端就无法使用此接口调用它们。
解决问题的简单方法是定义几个接口,例如:咖啡和牛奶。然后,您可以定义实现两个接口的类Capuchino
,并且可能包含2个实例:SimpleCofee
和FoamedMilk
。但是这个解决方案看起来更像是Decorator和Facade的组合。