装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。(星巴兹咖啡)

设计原则:类应该对扩展开放,对修改关闭。

我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可以搭配新的行为。如能实现这样的目标,有什么好处呢?这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求。

工程名称:Decorator(eclipse)  下载目录:http://www.cnblogs.com/jrsmith/admin/Files.aspx ,Decorator.zip

 1 package com.jyu.abstractclass;
 2
 3 /**
 4  * 饮料(组件)
 5  * @author JRSmith
 6  *
 7  */
 8 public abstract class Beverage {
 9
10     protected String description = "Unknown Beverage";
11
12     /**getDescription()已经在此实现了,但是cost()必须在子类中实现*/
13     public String getDescription(){
14         return description;
15     }
16
17     public abstract double cost();
18 }

 1 package com.jyu.abstractclass;
 2
 3 /**
 4  * 调料
 5  * @author JRSmith
 6  *
 7  */
 8 public abstract class Condiment extends Beverage {
 9
10     @Override
11     public abstract String getDescription();
12 }

View Code

 1 package com.jyu.extendsbeverage;
 2
 3 import com.jyu.abstractclass.Beverage;
 4
 5 /**
 6  * 低咖啡因
 7  * @author JRSmith
 8  *
 9  */
10 public class Decat extends Beverage {
11
12     public Decat() {
13         description = "Decat Coffee";
14     }
15
16     @Override
17     public double cost() {
18         return 1.05;
19     }
20
21 }

View Code

 1 package com.jyu.extendsbeverage;
 2
 3 import com.jyu.abstractclass.Beverage;
 4
 5 /**
 6  * 深焙
 7  * @author JRSmith
 8  *
 9  */
10 public class DarkRoast extends Beverage {
11
12     public DarkRoast() {
13         description = "DarkRoast Coffee";
14     }
15
16     @Override
17     public double cost() {
18         return .99;
19     }
20
21 }

View Code

 1 package com.jyu.extendsbeverage;
 2
 3 import com.jyu.abstractclass.Beverage;
 4
 5 /**
 6  * 浓缩咖啡
 7  * @author JRSmith
 8  *
 9  */
10 public class Espresso extends Beverage {
11
12     public Espresso(){
13         description = "Espresso Coffee";
14     }
15
16     @Override
17     public double cost() {
18         return 1.99;
19     }
20
21 }

View Code

 1 package com.jyu.extendsbeverage;
 2
 3 import com.jyu.abstractclass.Beverage;
 4
 5 /**
 6  * 综合咖啡
 7  * @author JRSmith
 8  *
 9  */
10 public class HouseBlend extends Beverage {
11
12     public HouseBlend() {
13         description = "House Blend Coffee";
14     }
15
16     @Override
17     public double cost() {
18         return .89;
19     }
20
21 }

View Code

 1 package com.jyu.extendscondiment;
 2
 3 import com.jyu.abstractclass.Beverage;
 4 import com.jyu.abstractclass.Condiment;
 5
 6 /**
 7  * 摩卡
 8  * @author JRSmith
 9  *
10  */
11 public class Mocha extends Condiment {
12
13     protected Beverage beverage;
14
15     public Mocha(Beverage beverage) {
16         this.beverage = beverage;
17     }
18
19     @Override
20     public String getDescription() {
21         return this.beverage.getDescription() + " , Mocha";
22     }
23
24     @Override
25     public double cost(){
26         return 0.20 + this.beverage.cost();
27     }
28
29 }

View Code

 1 package com.jyu.extendscondiment;
 2
 3 import com.jyu.abstractclass.Beverage;
 4 import com.jyu.abstractclass.Condiment;
 5
 6 /**
 7  * 豆浆
 8  * @author JRSmith
 9  *
10  */
11 public class Soy extends Condiment {
12
13     protected Beverage beverage;
14
15     public Soy(Beverage beverage) {
16         this.beverage = beverage;
17     }
18
19     @Override
20     public String getDescription() {
21         return this.beverage.getDescription() + " , Soy";
22     }
23
24     @Override
25     public double cost() {
26         return 0.15 + this.beverage.cost();
27     }
28
29 }

View Code

 1 package com.jyu.extendscondiment;
 2
 3 import com.jyu.abstractclass.Beverage;
 4 import com.jyu.abstractclass.Condiment;
 5
 6 /**
 7  * 奶泡
 8  * @author JRSmith
 9  *
10  */
11 public class Whip extends Condiment {
12
13     protected Beverage beverage;
14
15     public Whip(Beverage beverage) {
16         this.beverage = beverage;
17     }
18
19     @Override
20     public String getDescription() {
21         return this.beverage.getDescription() + " , Whip";
22     }
23
24     @Override
25     public double cost() {
26         return 0.10 + this.beverage.cost();
27     }
28
29 }

 1 package com.jyu.test;
 2
 3 import com.jyu.abstractclass.Beverage;
 4 import com.jyu.extendsbeverage.DarkRoast;
 5 import com.jyu.extendsbeverage.Espresso;
 6 import com.jyu.extendsbeverage.HouseBlend;
 7 import com.jyu.extendscondiment.Mocha;
 8 import com.jyu.extendscondiment.Soy;
 9 import com.jyu.extendscondiment.Whip;
10
11 public class StarbuzzCoffee {
12
13     /**
14      * @param args
15      */
16     public static void main(String[] args) {
17
18         /**订一杯Espresso,不需要调料,打印出它的描述与价钱*/
19         Beverage beverage = new Espresso();
20         System.out.println(beverage.getDescription() + " $" + beverage.cost());
21
22         /**制造出一个DarkRoast对象。用Mocha装饰它,用第二个Mocha装饰它,用Whip装饰它*/
23         Beverage beverage2 = new DarkRoast();
24         beverage2 = new Mocha(beverage2);
25         beverage2 = new Mocha(beverage2);
26         System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
27
28         /**最后,再来一杯调料为豆浆、摩卡、奶泡的HouseBlend咖啡*/
29         Beverage beverage3 = new HouseBlend();
30         beverage3 = new Soy(beverage3);
31         beverage3 = new Mocha(beverage3);
32         beverage3 = new Whip(beverage3);
33         System.out.println(beverage3.getDescription() + " $" + beverage3.cost());
34
35
36     }
37
38 }

转载于:https://www.cnblogs.com/damonhuang/archive/2012/09/14/2684380.html

设计模式之三:装饰者模式(简单实现(星巴兹咖啡))相关推荐

  1. Java设计模式之三--装饰者模式

    转载出处:http://blog.csdn.NET/lmj623565791/article/details/24269409 今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义. 装饰者 ...

  2. Java 设计模式之装饰者模式

    一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...

  3. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  4. 前端也要学系列:设计模式之装饰者模式

    什么是装饰者模式 今天我们来讲另外一个非常实用的设计模式:装饰者模式.这个名字听上去有些莫名其妙,不着急,我们先来记住它的一个别名:包装器模式. 我们记着这两个名字来开始今天的文章. 首先还是上< ...

  5. 设计模式学习----装饰器模式

    这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...

  6. 【设计模式】装饰器模式的使用

    问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...

  7. 5分钟读懂设计模式(2)---装饰者模式

    每当我们买了新房子之后,相信绝大部分人都会进行装修,给房子增加一些其他新的物品.不过,无论如何装修,这个房子还是这个房子,最本质的东西并没有变,有的只是我们通过装修的方式,给这个房子增加了一些额外的功 ...

  8. 设计模式 之 装饰者模式

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对 ...

  9. 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )

    文章目录 I . 装饰者模式概念 II . 装饰者模式适用场景 III . 装饰者模式优缺点 IV . 装饰者模式与继承对比 V . 装饰者模式相关设计模式 VI . 装饰者模式四个相关类 VII . ...

  10. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

最新文章

  1. 【文章】人的好运从哪里来?
  2. K-Means原理详解与Java代码实现细节
  3. 最短路径之dijkstra算法的C语言实现
  4. mysql8参数方案_Mysql8.0及以上 only_full_group_by以及其他关于sql_mode原因报错详细解决方案...
  5. 《计算机科学导论》 数据库基础知识
  6. 如何在python中识别未知的日期时区时区
  7. Adapter中notify(),notifyAll(),notifyDataSetChanged(),notifyDataSetInvalidaded()方法的区别
  8. 王建宙称乔布斯故意展开TD-LTE版iPhone
  9. 用java输出学生信息表代码_学生表 - java代码库 - 云代码
  10. react路由动画切换
  11. 列举5种常见的计算机硬件主要有哪些,计算机硬件组成有哪些
  12. 实验11 静态路由配置
  13. 怎样把jpg格式转换成pdf
  14. 命主属性是水什么意思_算命中红兔 请大师看看“此命盘的主人是 黑马,出生于红兔。日干代表命主,所以属 水”是什么意思...
  15. BGP进阶:BGP 综合实验一
  16. linux中cmd是什么文件格式,CMD 文件扩展名: 它是什么以及如何打开它?
  17. SQL中where子句中不能出现聚合函数的原因
  18. 软件功能测试订票系统,飞机票订票系统功能测试项目
  19. 有符号16进制转10进制工具分享
  20. Qt sqlite 使用备忘

热门文章

  1. 【百度地图-安卓SDK】从头开始写android程序
  2. windows 2003常用命令(推荐)
  3. linux - 查看是否安装 apache 以及 apache 版本
  4. 编译程序遇到问题 relocation R_X86_64_32 against `.rodata' can not be used when making a shared object;...
  5. 【小技巧】自定义asp.net mvc的WebFormViewEngine修改默认的目录结构
  6. 一步一步打造WebIM(1) (转载)
  7. 【面试题】---前端需要掌握的知识点-----更新...
  8. 【codevs1378】选课——树形动规
  9. YUV420查表法高效、无失真的转换为RGB32格式
  10. 微信公众平台开发(112) 微信卡券