您的位置:首页 > 其它

《Head First-Chapter3》装饰者模式

2016-04-28 11:22 225 查看

给爱用继承的人一个全新的设计眼界

-----装饰者模式

一、问题描述:不同口味的星巴克

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、设计类图



继承Beverage抽象类,是为了有正确的类型,而不是继承它的行为。行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。

2、code实现

<1>抽象组件和抽象装饰者



<2>具体组件(咖啡)





<3>具体装饰者(配料)





<4>测试



3、优点

满足开闭原则,拓展性强。当有新的配料时,只需添加新的配料类继承CondimentDecorator,而不会修改原来代码。

四、本章小结

1、开闭设计原则:对拓展开放,对修改关闭。
2、装饰者模式
4000
:动态地将责任(装饰者)附加到对象(具体组件)上。想要扩展功能,装饰者提供了有别于继承的另一种选择。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: