在《Head first design patterns》一书的装饰器章节中,它谈到了装饰器处理具体类型并引发问题时的问题。我正在复制本章中的一些问答:
问:我有点担心代码可能会测试特定的具体组件——比如说,HouseBlend——并做一些事情,比如发布折扣。一旦我用装饰器包裹了 HouseBlend,这将不再起作用。
答:完全正确。如果您的代码依赖于具体组件的类型,装饰器将破坏该代码。只要您只针对抽象组件类型编写代码,装饰器的使用对您的代码将保持透明。但是,一旦您开始针对具体组件编写代码,您将需要重新考虑您的应用程序设计和装饰器的使用。
有人可以举一个简单的例子来说明“客户端”代码是针对具体类型还是抽象类型编写的?前者是如何给装饰者带来麻烦的?
书中一个装饰器的示例测试代码是这样的:
public class StarbuzzCoffee {
public static void main(String args[]) {
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription()
+ “ $” + beverage2.cost());
...
}
}
这个测试代码(也是客户端代码)是针对抽象类型编写的吗?
谢谢,