星巴兹咖啡准备更新订单系统,以合乎他们的饮料供应需求。
他们原先的类设计为:
这样的订单系统没有办法考虑到咖啡调料的部分,把加入不同调料的咖啡看做不同的类会导致类爆炸(每个类的cost方法计算出咖啡加调料的价钱):
很明显,这样的系统难以维护,一旦牛奶的价钱上扬或新增一种焦糖调料,系统将难以改变。
采用实例变量和继承的设计也许能解决一些问题:
Beverage作为一个饮料类,加上实例变量代表是否加入了饮料。
然而当用户想要双倍摩卡咖啡时,这样的系统就显得有些无所适从。
对于冰茶,饮料基类里的有些调料根本不适用,但是也一起继承了过来!
到目前为止,使用继承会造成的问题有:类爆炸,设计死板,以及基类加入的新功能并不适用于所有的子类。
所以继承并不是解决问题的方法,应当使用组合来使系统更有弹性且易于维护。
开放-关闭原则:
设计原则:
类应该对扩展开放,对修改关闭。
我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为。
这个目标需要使用装饰着模式实现:以饮料为主体,然后运行调料来“装饰”饮料。
如图为一个摩卡和奶泡DarkRoast咖啡的设计图:
定义装饰者模式:
装饰者模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案。
装饰者模式类图:
现在让星巴兹咖啡系统也符合装饰者类图:
具体实现:
从饮料下手,将饮料作为一个抽象类:
调料抽象类,也就是装饰者类:
实现具体的饮料(浓缩咖啡和综合咖啡):
实现具体装饰者类(摩卡)
其他装饰者类的实现方式与摩卡类似。
测试代码:
测试结果:
JAVA中的装饰者模式(java.io类):
Java I/O引出装饰者模式的一个“缺点”:利用装饰者模式,会造成设计中存在大量的小类。
编写自己的Java I/O装饰者,把输入流中的所有大写字母转成小写:
测试程序(测试刚刚写好的I/O装饰者)
测试结果:
分享到:
相关推荐
笔记_HeadFirst设计模式
经典的设计模式书籍打包:Head First 设计模式 +Java设计模式(第2版)
Head First设计模式(完整高清版).pdf,涵盖了各种宝贵的设计思想!
Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现 VS2012 下通过
Head First 设计模式Head First 设计模式Head First 设计模式Head First 设计模式Head First 设计模式Head First 设计模式Head First 设计模式Head First 设计模式Head First 设计模式Head First 设计模式Head First...
head first 设计模式 高清中文版 pdf
如果你曾经读过任何一本深入浅出(Head First)系列书籍,你就会知道能够从本书中得到的是:透过丰富的视觉效果让你的大脑充分地运作。本书的编写运用许多最新的研究,包括神经生物学、认知科学以及学习理论,这使得...
Head First设计模式, 中国电力出版社出版,英文书名:Head First Design Patterns。作者:弗里曼。《Head First设计模式》荣获2005年第十五届Jolt通用类图书震撼大奖。英文影印版被《程序员》等机构评选为2006年受...
Head First设计模式中文版 Head First设计模式中文版 Head First设计模式中文版
Head First设计模式 Head First设计模式 Head First设计模式
head first设计模式 下载地址 head first设计模式 下载地址 head first设计模式 下载地址 head first设计模式 下载地址 head first设计模式 下载地址
重视大脑的学习指南Head First设计模式,学习为何朋友们对工厂模式的认知可能有错,把事关紧要的模式直接装入脑海里,发掘模式大师的秘密,避免一些尴尬的错误,探究星巴兹咖啡如何以装饰者模式让自己的股价翻倍。
[中文]Head-First设计模式.pdf.
HeadFirst 设计模式学习笔记3--装饰模式 Demo http://blog.csdn.net/laszloyu/archive/2010/05/12/5582561.aspx
Head First设计模式高清非扫描中文版.zip.002。一共三个压缩包,都上传了
head first 设计模式 观察者模式 C++ 代码
head first 设计模式高清完整版+标签
Head First设计模式 c++代码实现
Head.First设计模式 Head.First设计模式Head.First设计模式 Head.First设计模式 Head.First设计模式