使用装饰者模式动态扩展对象功能

需积分: 12 9 下载量 166 浏览量 更新于2024-12-24 收藏 2.36MB PDF 举报
"Head.First设计模式_PDF79-107.pdfg高清中文版" 在《Head First设计模式》的这一章节中,作者聚焦于装饰者模式,一种用于动态地给对象添加新功能的设计模式,特别适用于避免过度使用继承的情况。装饰者模式的核心理念是在运行时通过对象组合而非继承来扩展对象的行为。 3. 装饰者模式 装饰者模式是一种结构型设计模式,它允许在不改变原有对象的前提下,通过包装一个对象并添加额外的职责来扩展其功能。这种模式强调的是在运行时动态地增加功能,而不是在编译时通过继承关系来实现。 4. 继承与装饰者的对比 书中以一个咖啡店——星巴兹(Starbuzz)的例子来阐述问题。最初的类设计是基于继承的,如Espresso、Decaf、DarkRoast和HouseBlend等饮料类都是Beverage(饮料)的子类,各自实现了cost()方法来计算价格。然而,当需要为饮料添加调料(如蒸奶、摩卡、豆浆等)并随之调整价格时,使用继承就显得不够灵活,因为每次添加新调料都需要创建一个新的子类,这会导致类爆炸问题。 5. 装饰者的应用 星巴兹的订单系统开始尝试使用装饰者模式来改进。装饰者类同样继承自Beverage,但它们不直接包含饮料的价格,而是持有Beverage对象的引用,并在其基础上增加调料的费用。例如,SteamedMilk、Soy、Mocha和Whip等调料类都是装饰者,它们可以独立地附加到HouseBlend或其他饮料上,从而实现了动态扩展饮料的功能。 6. 代码示例 书中展示了如何使用装饰者模式来表示不同种类的咖啡加上不同调料的组合。如HouseBlendWithSteamedMilkAndCaramel类并不是一个新的饮料类型,而是一个装饰者,它会在基础饮料的成本上加上蒸奶和焦糖的费用。这样,通过组合不同的装饰者,可以创建出无数种可能的饮料组合,而无需为每种组合创建单独的类。 总结: 装饰者模式是一种强大的设计工具,尤其在需要灵活扩展对象功能而不想受制于继承体系的时候。通过对象的组合,装饰者模式可以在运行时动态地给对象添加职责,提供了一种更灵活、可扩展的解决方案,避免了因过度使用继承而导致的类结构复杂化问题。在星巴兹咖啡的例子中,它成功地解决了添加调料和计算成本的问题,展示了装饰者模式的实际应用价值。