设计模式 - 装饰者模式.doc

上传人:壹****1 文档编号:557246601 上传时间:2022-09-24 格式:DOC 页数:10 大小:541.50KB
返回 下载 相关 举报
设计模式 - 装饰者模式.doc_第1页
第1页 / 共10页
设计模式 - 装饰者模式.doc_第2页
第2页 / 共10页
设计模式 - 装饰者模式.doc_第3页
第3页 / 共10页
设计模式 - 装饰者模式.doc_第4页
第4页 / 共10页
设计模式 - 装饰者模式.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《设计模式 - 装饰者模式.doc》由会员分享,可在线阅读,更多相关《设计模式 - 装饰者模式.doc(10页珍藏版)》请在金锄头文库上搜索。

1、设计模式读书笔记-装饰者模式 我们都知道,可以使用两种方式给一个类或者对象添加行为。 一是使用继承。继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法。但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机。 二是使用关联。组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为。这是一种动态的方式,我们可以在应用程序中动态的控制。 与继承相比,关联关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,可以使系统更加容易维护。但是它的缺点就在于要创建比继承更多的对象。

2、 一、基本定义 装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。 二、模式结构 装饰者模式UML结构图。 Component: 抽象构件。是定义一个对象接口,可以给这些对象动态地添加职责。 ConcreteComponent:具体构件。是定义了一个具体的对象,也可以给这个对象添加一些职责。 Decorator: 抽象装饰类。是装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的。 ConcreteDecorator:具体装饰类,起到给Component添加职责的

3、功能。 三、实现装饰者模式 情景模式:星巴兹以扩张速度快而闻名。在里面购买咖啡时,可以要求在其中加入各种调料,星巴兹会根据所加入的调料收取不同的费用,也就是说不同的咖啡与调料之间有N多不同的组合方式。每种咖啡和调料都有不同的收费。如果这个时候我们使用继承方式,则会陷入无以复加的地步。这里会有N多个类,出现“类爆炸”现象。 结构图如下: 装饰者模式提供了一个比较好的解决方案。 编码实现: Component Beverage.java1 public abstract class Beverage 2 protected String description = Unknown Beverage

4、;3 4 public String getDescription() 5 return description;6 7 8 public abstract double cost();9 四个组件:HouseBlend.java1 public class HouseBlend extends Beverage 2 3 public HouseBlend() 4 description = HouseBlend; 5 6 7 Override 8 public double cost() 9 return 0.89;10 11 12 DarkRoast.java1 public class

5、DarkRoast extends Beverage 2 public DarkRoast() 3 description = DarkRoast; 4 5 Override 6 public double cost() 7 return 1.05; 8 9 10 Espresso.java1 public class DarkRoast extends Beverage 2 public DarkRoast() 3 description = DarkRoast; 4 5 Override 6 public double cost() 7 return 1.05; 8 9 10 Decat.

6、java1 public class Decat extends Beverage 2 public Decat() 3 description = Decat; 4 5 6 Override 7 public double cost() 8 return 0.99; 9 10 11 CondimentDecorator.java1 public abstract class CondimentDecorator extends Beverage2 public abstract String getDescription();3 Milk.java1 public class Milk ex

7、tends CondimentDecorator 2 Beverage beverage; 3 4 public Milk(Beverage beverage) 5 this.beverage = beverage; 6 7 8 Override 9 public String getDescription() 10 return beverage.getDescription() + , Milk;11 12 13 Override14 public double cost() 15 return beverage.cost() + 0.3;16 17 Mocha.java1 public

8、class Mocha extends CondimentDecorator 2 Beverage beverage; 3 public Mocha(Beverage beverage) 4 this.beverage = beverage; 5 6 7 Override 8 public String getDescription() 9 return beverage.getDescription() + , Mocha;10 11 12 Override13 public double cost() 14 return beverage.cost() + 0.20;15 16 17 So

9、y.java1 public class Soy extends CondimentDecorator 2 Beverage beverage; 3 public Soy(Beverage beverage) 4 this.beverage = beverage; 5 6 Override 7 public String getDescription() 8 return beverage.getDescription() + , Soy; 9 10 11 Override12 public double cost() 13 return beverage.cost() + 0.10;14 1

10、5 16 Whip.java1 public class Whip extends CondimentDecorator 2 Beverage beverage; 3 public Whip(Beverage beverage) 4 this.beverage = beverage; 5 6 Override 7 public String getDescription() 8 return beverage.getDescription() + , Whip; 9 10 11 Override12 public double cost() 13 return beverage.cost()

11、+ 0.20;14 15 16 测试程序1 public class StarbuzzCoffee 2 3 /* 4 * param args 5 */ 6 public static void main(String args) 7 Beverage beverage = new Espresso(); 8 System.out.println(beverage.getDescription() + $ + beverage.cost(); 9 10 Beverage beverage2 = new DarkRoast();11 beverage2 = new Mocha(beverage2);12 beverage2 = new Mocha(beverage2);13 beverage2 = new Whip(beverage2);14 System.out.println(beverage2.getDescription() +

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号