标签:
给爱用继承的人一个全新的设计眼界
-----装饰者模式
一、问题描述:不同口味的星巴克
1、咖啡加配料
点咖啡时,可以加配料或不加,星巴克会根据所加入的调料收取不同的费用。
如:来一杯深焙咖啡,加摩卡和奶泡,一共99+20+10 = 129
2、糟糕设计一:类爆炸
每种配料的咖啡都设计一个类,如一杯深焙咖啡,加摩卡和奶泡,DarkRoastWithMochaAndMilk
注:Beverage是饮料基类。
3、缺陷设计二:有新的需求(如新的配料,配料价格调整等)会更改现有代码
把配料作为变量放超类中。
(1)类图
(2)实现
(3)缺点
当配料调价时,会修改已有代码;当有新配料时,会修改在Beverage中加上并且要修改cost()
当要加双倍牛奶怎么办?
二、装饰者模式
1、设计原则:开闭原则
类应该对扩展开放,对修改关闭。
目标:允许类容易扩展,在不修改现有代码的情况下,添加新的行为。
注:并不是每个地方都采用开闭原则,也没必要,可能会导致代码变得复杂且难以理解,要灵活运用。
2、初识装饰者模式-----不同口味的咖啡
有一杯咖啡,根据加入不同调料,计算价格,如一杯“加摩卡和奶泡的深焙咖啡”
(1)有一个深焙咖啡(DarkRoast)对象
(2)以摩卡(Mocha)对象装饰它
(3)以奶泡(Whip)对象装饰它
(4)调用cost()方法,并依赖委托将调料的价格加上去
2、定义
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
3、类图
三、观察者模式解决星巴克
1、设计类图
2、code实现
<1>抽象组件和抽象装饰者
<2>具体组件(咖啡)
<3>具体装饰者(配料)
<4>测试
《Head First-Chapter3》装饰者模式
标签:
原文地址:http://blog.csdn.net/wwyl1001/article/details/51272298