- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
装饰者模式
第7章 设计模式 * 问题1星巴克决定在菜单上加上咖啡的容量大小,供顾客选择小杯(tall)、中杯(grande)、大杯(venti);另外还需要根据咖啡容量收费,比如小中大杯咖啡加上豆浆(Soy),分别加收0.10、0.15、0.20美金。我们应该如何改变装饰者类应对这样的需求? 7.3 装饰者模式 第7章 设计模式 * 7.3 装饰者模式 第7章 设计模式 * 问题2在装饰者模式中,是否可以允许装饰者知道一连串装饰链条中其他装饰者地存在?比如,我们需要使用getDescription()列出“Whip, Double Mocha”,而不是“Mocha, Whip, Mocha”。我们应该如何设计装饰者模式才能满足这种需求? 7.3 装饰者模式 第7章 设计模式 * 星巴克咖啡订单管理系统管理、计算各种饮料的售价。 7.3 装饰者模式 Espresso浓缩咖啡 HouseBlend家常咖啡 DarkRoast深焙咖啡 Decaf脱咖啡因咖啡 Mocha摩卡 Milk蒸奶 Ice冰 第7章 设计模式 * 实现1 7.3 装饰者模式 第7章 设计模式 * 实现1类爆炸 调料的增加/删除 调料价格的修改 7.3 装饰者模式 第7章 设计模式 * 实现2 使用实例变量和继承,跟踪这些调料 7.3 装饰者模式 第7章 设计模式 * 实现2 7.3 装饰者模式 第7章 设计模式 * 问题:实现cost方法 7.3 装饰者模式 第7章 设计模式 * 当哪些因素改变时会影响这个设计? 调料价钱的改变会使我们更改现有代码。 一旦出现新的调料,我们就需要加上新的方法,并改变超类中的cost()方法。 以后可能会开发出新饮料,对于这些饮料而言(冰茶),某些调料可能并不适合,但是在这个设计方式中,Tea子类仍将继承那些不合适的方法,比如:hasWhip()。 如何顾客想要双倍摩卡,怎么办? …… 7.3 装饰者模式 第7章 设计模式 * 设计原则(Open-Closed?Principle)类应该对扩展开放,对修改关闭。 我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为。如能实现这样的目标,其好处在于:这样的设计具有弹性,可以应对改变,可以接受新的功能来应对改变的需求。 如何让设计的每个部分都遵循开放-关闭原则? 这通常是无法做到的。要让OO设计同时具有开放性和关闭性,又不修改现有的代码,需要花费许多时间和努力。一般来说,我们没有足够的精力把设计的每个部分都这么设计,这可能只是一种浪费。 遵循开放-关闭原则,通常会引入新的抽象层次,增加代码的复杂度。你需要把注意力集中在设计中最有可能改变的地方,然后应用开放-关闭原则。 7.3 装饰者模式 第7章 设计模式 * 星巴克咖啡订单管理系统——使用装饰者模式 以饮料(Beverage)为主体,然后在运行时以调料(Condiment)来装饰(decorate)饮料 比如,顾客想要摩卡和奶泡深焙咖啡,那么: 取出一个深焙咖啡(DarkRoast)对象 以摩卡(Mocha)对象装饰它 以奶泡(Whip)对象装饰它 调用cost方法,并依赖委托(delegrate)将调料的价格加上去 7.3 装饰者模式 第7章 设计模式 * 以DarkRoast对象开始 顾客需要摩卡(Mocha),所以建立一个Mocha对象,并用它将DarkRoast对象包起来 7.3 装饰者模式 第7章 设计模式 * 顾客也想要奶泡(Whip),所以建立一个Whip装饰者,并用它将Mocha对象包起来 7.3 装饰者模式 第7章 设计模式 * 通过调用最外圈装饰者(Whip)的cost即可计算饮料价格。 7.3 装饰者模式 第7章 设计模式 * “装饰者模式”——特点 装饰者和被装饰对象具有相同的超类型 可以用一个或多个装饰者包装一个对象 由于装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装)的场合,都可以用装饰过的对象代替她 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的 对象可以在任何时候被装饰,所以可以在运行时动态的、不限量的用需要的装饰者来装饰对象 装饰者模式定义装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 7.3 装饰者模式 第7章 设计模式 * 7.3 装饰者模式 第7章 设计模式 * 7.3 装饰者模式 第7章 设计模式 * 问题为什么Decorate类扩展自Component类? 装饰者和被装饰者必须是一样的类型,我们在此使用继承达到“类型匹配” 类型匹配意味着装饰者和被装饰者具有相同的接口,从而装饰者可以取代被
文档评论(0)