第8章装饰者模式.ppt_第1页
第8章装饰者模式.ppt_第2页
第8章装饰者模式.ppt_第3页
第8章装饰者模式.ppt_第4页
第8章装饰者模式.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第八章 装饰者模式,欢迎饮用星巴兹(Starbuzz)咖啡 最初设计的订购系统(下页):,2,焦炒咖啡,家庭混合咖啡,无咖啡因咖啡,蒸馏咖啡,3,购买咖啡时,每一种咖啡中能添加一种或几种调料:steamed milk(蒸煮的牛奶), soy(酱油), mocha(摩卡,也称 为巧克力),和 whipped milk (加了甜点心的牛奶)。每一种调料都要收一点钱,星巴兹(Starbuzz)咖啡订购系统变成下面的样子(下页):,4,每个cost()方法计算咖啡及各种调料的价钱。,类爆炸!,从基类派生添加了各种调料的咖啡子类。,5,6,修改后的订购系统,7,修改后的订购系统怎么样?,8,这个设计

2、的缺陷 如果调料的价格改变,我们需要修改现存的代码。 如果增加了新的调料,我们需要在基类增加新的方 法以及修改cost()方法。 我们也可能有新的饮料类型。一些饮料类型,例如, 冰茶(ice tea),现有的调料可能是不合适的。但是, 茶子类仍然后继承基类的调料方法。 如果客户需要双份mocha,怎么办呢?,9,开闭原则,我们的目的是允许类易于扩展,组合新的行为, 但不修改现有的代码。,10,会会装饰者模式 我们已经看到:附加调料的饮料定价模式,用继承表示是不合适的;在基类增加调料的实例变量和方法,对一些子类也是不合适的。 这里,我们试试:以饮料为主体,用调料“装饰”饮料。例如,如果客户需要D

3、ark Roast(焦炒咖啡) ,添加Mocha(摩卡)和Whip(甜点心)。,11,会会装饰者模式(续) 我们可以: 取DarkRoast (焦炒咖啡)对象; 用Mocha (摩卡)对象装饰它; 用Whip (甜点心)对象装饰它; 调用cost()方法计算价格,总价格的计算需要委托。 但是,我们怎样装饰一个对象?又怎样委托?,12,用装饰者构造饮料订购系统 从DarkRoast (焦炒咖啡)对象开始,13,客户需要Mocha (摩卡) ,所以,我们创建一个Mocha 对象,并用它包装DarkRoast (焦炒咖啡) 。,装饰者对象是“包装者”。,14,客户也需要Whip (甜点心) ,所以,

4、我们也创建一个 Whip装饰者,并用它包装Mocha (摩卡) 。,15,现在为客户计算价格。我们调用最外层装饰者(Whip 甜点心)的cost()。Whip委托它所装饰的对象计算价格。 它获得了价格后,再累加Whip的价格。,16,目前做的 装饰者和被装饰对象有相同的超类型; 可以用一个或多个装饰者包装一个对象; 任何时候需要原始对象(即被包装的对象),都可以用装 饰过的对象代替它。因为装饰者和被装饰者有相同的 超类型; 装饰者可以在所委托的被装饰者的行为之前与/或之后, 加上自己的行为,以达到特定的目的。 对象可以在任何时候被装饰,所以可以在运行时动态 地、不限量地使用装饰者来装饰对象。,

5、17,装饰者模式定义,18,装饰者模式类图,19,装饰我们 的饮料,20,写星巴兹(Strbuzz)代码 我们从Beverage类开始,它与原设计是一样的: public abstract class Beverage String description = Unknown Beverage; public String getDescription() return description; public abstract double cost(); ,21,实现调料(装饰者)抽象类 public abstract class CondimentDecorator extends Bev

6、erage public abstract String getDescription(); ,22,对饮料编码 public class Espresso extends Beverage /蒸馏咖啡 public Espresso() description = Espresso; public double cost() return 1.99; ,23,对饮料编码(续) public class HouseBlend extends Beverage /家庭混合咖啡 public HouseBlend() description = House Blend Coffee; public

7、 double cost() return .89; ,24,实现调料(装饰者)具体类 public class Mocha extends CondimentDecorator / 摩卡 Beverage beverage; public Mocha(Beverage beverage) this.beverage = beverage; public String getDescription() return beverage.getDescription() + , Mocha; public double cost() return .20 + beverage.cost(); ,描

8、述不只是饮料,还要包括添加的调料。,25,订购星巴兹(Starbuzz)咖啡的测试代码 public class StarbuzzCoffee public static void main(String args) Beverage beverage = new Espresso(); / 蒸馏咖啡 System.out.println(beverage.getDescription() + $ + Beverage.cost(); Beverage beverage2 = new DarkRoast(); / 焦炒咖啡 beverage2 = new Mocha(beverage2); /

9、 添加摩卡 beverage2 = new Mocha(beverage2); / 添加摩卡 beverage2 = new Whip(beverage2); / 添加甜点心 System.out.println(beverage2.getDescription() + $ + beverage2.cost(); Beverage beverage3 = new HouseBlend(); / 家庭混合咖啡 beverage3 = new Soy(beverage3); / 添加酱油 beverage3 = new Mocha(beverage3); / 添加摩卡 beverage3 = new Whip(beverage3); / 添加甜点心 System.out.println(beverage3.getDescripti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论