2011-12-27 98 views
6

使用维基百科(http://en.wikipedia.org/wiki/Decorator_pattern)上显示的咖啡装饰例子如何有可能让某人能够拥有只有装饰者有的方法,例如,牛奶装饰可以有一个方法称为“fatContent”。这种设计模式甚至可能吗?如果不是,我可以用什么样的模式来完成这个?装饰模式与装饰特定的方法在Java

+0

我不知道那种设计模式。老实说,我不喜欢它。 – 2011-12-27 13:55:00

+0

@MartijnCourteaux维基百科的咖啡例子是从书[Your Brain On Design Patterns]中提取的(http://headfirstlabs.com/books/hfdp/)。但它只包含一小部分,没有进一步解释。我推荐这个讲座来全面了解这个模式。 – Beccari 2011-12-27 14:13:09

+1

@MartijnCourteaux装饰??它是最有用的*模式之一,IMO。 – 2011-12-27 14:23:45

回答

3

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

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

4

装饰者可以有任何数量的具体方法。您可能会引入一个装饰器特定的接口,装饰器除了实现装饰性接口外还会实现该接口。

然而,有人知道这些方法存在,因此无论是装饰有内部调用方法,调用方必须知道它使用装饰的装饰对象,而不是(你可以测试使用instanceof)或使用反射来检查这些方法。

9

可能,但你要知道,以实际呼叫方法(假设没有反射等),如果它不符合你绕过类型的类型。

类型确定在编译时已知什么:如果CoffeeDecorater不包含fatContent签名,则没有任何接收CoffeeDecoractor的人知道该方法存在。

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

Java或者知道在编译时存在一个方法,或者在运行时检查它。