设计模式探索:运行时扩展与装饰者模式

需积分: 12 0 下载量 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` 类并不直接定义成本,而是调用基础饮料的成本并加上蒸奶和焦糖的成本。这种方式使得添加新的调料变得非常灵活,只需添加新的装饰类,而不需要修改原始的饮料类或创建新的饮料子类。 通过装饰者模式,星巴兹的订单系统可以根据客户的选择动态地装饰基础饮料,添加调料,同时保持代码的整洁和可维护性。这比使用继承来为每种可能的饮料组合创建一个新的类更为高效,也更符合开闭原则——对扩展开放,对修改关闭。