设计模式探索:运行时扩展与装饰者模式
需积分: 12 178 浏览量
更新于2024-11-07
收藏 2.36MB PDF 举报
"设计模式 Head First 系列书籍的第五部分,主要讲解了装饰者模式。书中通过星巴兹咖啡店的案例,展示了如何利用装饰者模式解决类的扩展和组合问题,以避免过度使用继承。"
设计模式是软件开发中的一套经过验证的解决方案,它们是针对特定问题的通用、可重用的设计方案。Head First 设计模式系列书籍以其独特的视觉和轻松的学习方式,帮助读者理解并掌握这些模式。在这个第五部分中,重点讲解的是装饰者模式。
装饰者模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,而无需修改对象的源代码或创建新类。这种模式通常用于当需要动态地改变或增强对象功能时,而不是通过静态的继承关系来实现。
在星巴克咖啡的例子中,`Beverage` 是一个抽象基类,代表所有的饮料,如 `Espresso`, `Decaf`, `DarkRoast` 和 `HouseBlend`。这些子类各自实现了 `cost()` 方法来计算饮料的价格,并使用 `description` 来存储饮料的描述。然而,随着业务需求的增加,单纯继承不能满足为现有饮料添加调料(如蒸奶、摩卡、豆浆等)并相应调整价格的需求。
这就是装饰者模式发挥作用的地方。装饰者模式不创建新的子类,而是通过包装现有的对象,并提供额外的行为。在这个例子中,可以创建装饰类如 `SteamedMilk`, `Soy`, `Mocha`, `Whip` 等,它们都继承自 `Beverage` 类,但并不直接实现饮料的价格计算。相反,它们会持有对基础饮料对象的引用,并在其 `cost()` 方法中增加相应的调料费用。
例如,`HouseBlendWithSteamedMilkAndCaramel` 类并不直接定义成本,而是调用基础饮料的成本并加上蒸奶和焦糖的成本。这种方式使得添加新的调料变得非常灵活,只需添加新的装饰类,而不需要修改原始的饮料类或创建新的饮料子类。
通过装饰者模式,星巴兹的订单系统可以根据客户的选择动态地装饰基础饮料,添加调料,同时保持代码的整洁和可维护性。这比使用继承来为每种可能的饮料组合创建一个新的类更为高效,也更符合开闭原则——对扩展开放,对修改关闭。
3402 浏览量
329 浏览量
2012-09-21 上传
181 浏览量
2014-12-06 上传
2018-12-07 上传
taidi5
- 粉丝: 0
- 资源: 6
最新资源
- 设置Windows 10 1903/1909/2004的脚本-.NET开发
- 一个TCP和UPD聊天、传收文件程序
- Homework-QUestion
- MTK10.0竖屏壁纸居中补丁.zip
- xiubox
- 键盘测试工具,机械键盘换轴后检测用
- echidna:W3C的新发布工作流程-主要组件
- Vue Devtools
- SoapUI(附安装步骤).rar
- pid控制器代码matlab-CDC18a:A.Selivanov和E.Fridman,“PID控制器的鲁棒采样数据实现”,在第57届IEEE
- animeWiki
- mcjoin:简单的多播测试应用程序
- abc:aa
- Asc2Silo file converter-开源
- 行业文档-设计装置-一种拱桥施工平台结构.zip
- BE2Works_v4.52_Bohol_fu11.7z