使用维基百科(http://en.wikipedia.org/wiki/Decorator_pattern)上显示的咖啡装饰例子如何有可能让某人能够拥有只有装饰者有的方法,例如,牛奶装饰可以有一个方法称为“fatContent”。这种设计模式甚至可能吗?如果不是,我可以用什么样的模式来完成这个?装饰模式与装饰特定的方法在Java
6
A
回答
3
根据定义,Decorator模式不允许添加接口中定义的方法以外的方法。实际上,您可以随时向任何类添加方法,但是一旦这些方法未在实现接口中定义,客户端就无法使用此接口调用它们。
简单的解决您的问题是定义几个接口,例如,咖啡和牛奶。然后,您可以定义类Capuchino
,该类实现了两个接口并可能包含2个实例:SimpleCofee
和FoamedMilk
。但是这个解决方案更像是Decorator和Facade的组合。
4
装饰者可以有任何数量的具体方法。您可能会引入一个装饰器特定的接口,装饰器除了实现装饰性接口外还会实现该接口。
然而,有人知道这些方法存在,因此无论是装饰有内部调用方法,调用方必须知道它使用装饰的装饰对象,而不是(你可以测试使用instanceof
)或使用反射来检查这些方法。
9
您可能,但你要知道,以实际呼叫方法(假设没有反射等),如果它不符合你绕过类型的类型。
类型确定在编译时已知什么:如果CoffeeDecorater
不包含fatContent
签名,则没有任何接收CoffeeDecoractor
的人知道该方法存在。
您可以创建一个额外的界面,但您需要知道它存在以便您可以检查它(instanceof
),或询问该类以检查特定签名(反射)。
Java或者知道在编译时存在一个方法,或者在运行时检查它。
相关问题
- 1. 装饰模式与方法关系
- 2. 装饰方法,在Java
- 3. 装饰模式
- 4. 装饰模式问题 - 如何调用嵌套装饰方法?
- 5. 装饰模式装饰器限制
- 6. Java装饰模式:我可以装饰受保护的方法吗?
- 7. WPF装饰者与定制装饰者?
- 8. 装饰类装饰类方法
- 9. 如何从装饰模式中删除装饰对象Java中的模式
- 10. 装饰装饰器
- 11. 装饰模式在smalltalk
- 12. 装饰模式问题在JAVA
- 13. DRY与装饰模式在PHP 5.3
- 14. 装饰在Java中
- 15. 装饰方法在Python
- 16. 在Python中装饰方法
- 17. JavaScript的装饰模式
- 18. 精细的装饰模式
- 19. C++中的装饰模式
- 20. java中的装饰设计模式
- 21. 为什么在装饰设计模式命名为“装饰”?
- 22. Java的装饰简单的方法
- 23. 如何找到所有装饰有特定装饰的课程?
- 24. 与装饰器
- 25. 最终方法的Java类装饰器
- 26. 缺少装饰的Java方法(ala Ruby)?
- 27. 装饰类的方法
- 28. Python中的装饰器必须实现装饰器模式吗?
- 29. 补丁模块与装饰
- 30. 装修模式中的装饰顺序
我不知道那种设计模式。老实说,我不喜欢它。 – 2011-12-27 13:55:00
@MartijnCourteaux维基百科的咖啡例子是从书[Your Brain On Design Patterns]中提取的(http://headfirstlabs.com/books/hfdp/)。但它只包含一小部分,没有进一步解释。我推荐这个讲座来全面了解这个模式。 – Beccari 2011-12-27 14:13:09
@MartijnCourteaux装饰??它是最有用的*模式之一,IMO。 – 2011-12-27 14:23:45