《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
:动态地将责任(装饰者)附加到对象(具体组件)上。想要扩展功能,装饰者提供了有别于继承的另一种选择。
相关文章推荐
- 各种工业以太网比较(EtherCAT,EtherNet/IP,ProfiNet,Modbus-TCP,Powerlink)
- JSP学生信息管理系统
- Gradle 学习笔记
- Remove Duplicates from Sorted Array
- 验证手机号是否正确
- 数据库中创建unique唯一约束
- ListView以及常用Adapter使用总结
- 关系数据库的几种设计范式
- 高效访问数据库—SQL语言技术
- 代码的坏味道(1)—重构改善代码的既有设计
- 代码的坏味道(2)—重构改善代码的既有设计
- 将博客搬至CSDN
- 设计模式 - 访问者模式
- 8. H5 pushState/popstate + ajax开发无刷新页面
- 一个比较完整的Inno Setup 安装脚本(转)
- 使用Firebug进行断点调试详解
- JavaScript 设计模式之单例模式
- 简单地C#导出word(三)
- HDU 5601 N*M bulbs
- Java.math.BigDecimal.subtract()方法实例