原文:http://www.blogjava.net/sterning/archive/2008/01/21/176679.html
一、要完成的任务
星巴兹(Starbuzz)是以扩张速度最快而闻名的咖啡连锁店。如果你在街角看到它的店,在对面街上肯定还会看到另一家。因为扩张速度实在太快了,他们准备更新订单系统,以合乎他们的饮料供应要求。他们原先的类设计是这样的……

购买咖啡时,也可以要求在其中加入各种调料,例如:蒸奶(Steamed Milk)、豆浆(Soy)、摩卡(Mocha,也就是巧克力风味)或覆盖奶泡。星巴兹会根据所加入的调料收取不同的费用。所以订单系统必须考虑到这些调料部分。
二、Decorator模式
1、一个原则
类应该对扩展开放,对修改关闭
2、定义装饰者模式
装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

3.分析任务



4.设计任务

三、代码实现
1.定义抽象类
(1)饮料抽象类Beverage
Beverage.java


















(2)调料抽象类CondimentDecorator
CondimentDecorator.java











2.饮料实现
(1)Espresso
Espresso.java











(2)HouseBlend
HouseBlend.java


















(3)DarkRoast
DarkRoast.java

















(4)Decaf
Decaf.java

















3.调料实现
(1)Mocha
Mocha.java

































(2)Soy
Soy.java





















(3)Whip
Whip.java





















4.测试类StarbuzzCoffee
StarbuzzCoffee.java





































源代码下载: ch3_decorator.rar