设计模式之三:装饰者模式(简单实现(星巴兹咖啡))
装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。(星巴兹咖啡)
设计原则:类应该对扩展开放,对修改关闭。
我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可以搭配新的行为。如能实现这样的目标,有什么好处呢?这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求。
工程名称: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 }
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 }
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 }
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 }
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 }
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 }
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 }
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
设计模式之三:装饰者模式(简单实现(星巴兹咖啡))相关推荐
- Java设计模式之三--装饰者模式
转载出处:http://blog.csdn.NET/lmj623565791/article/details/24269409 今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义. 装饰者 ...
- Java 设计模式之装饰者模式
一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- 前端也要学系列:设计模式之装饰者模式
什么是装饰者模式 今天我们来讲另外一个非常实用的设计模式:装饰者模式.这个名字听上去有些莫名其妙,不着急,我们先来记住它的一个别名:包装器模式. 我们记着这两个名字来开始今天的文章. 首先还是上< ...
- 设计模式学习----装饰器模式
这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...
- 【设计模式】装饰器模式的使用
问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...
- 5分钟读懂设计模式(2)---装饰者模式
每当我们买了新房子之后,相信绝大部分人都会进行装修,给房子增加一些其他新的物品.不过,无论如何装修,这个房子还是这个房子,最本质的东西并没有变,有的只是我们通过装修的方式,给这个房子增加了一些额外的功 ...
- 设计模式 之 装饰者模式
2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对 ...
- 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )
文章目录 I . 装饰者模式概念 II . 装饰者模式适用场景 III . 装饰者模式优缺点 IV . 装饰者模式与继承对比 V . 装饰者模式相关设计模式 VI . 装饰者模式四个相关类 VII . ...
- C#设计模式(9)——装饰者模式(Decorator Pattern)
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...
最新文章
- 【文章】人的好运从哪里来?
- K-Means原理详解与Java代码实现细节
- 最短路径之dijkstra算法的C语言实现
- mysql8参数方案_Mysql8.0及以上 only_full_group_by以及其他关于sql_mode原因报错详细解决方案...
- 《计算机科学导论》 数据库基础知识
- 如何在python中识别未知的日期时区时区
- Adapter中notify(),notifyAll(),notifyDataSetChanged(),notifyDataSetInvalidaded()方法的区别
- 王建宙称乔布斯故意展开TD-LTE版iPhone
- 用java输出学生信息表代码_学生表 - java代码库 - 云代码
- react路由动画切换
- 列举5种常见的计算机硬件主要有哪些,计算机硬件组成有哪些
- 实验11 静态路由配置
- 怎样把jpg格式转换成pdf
- 命主属性是水什么意思_算命中红兔 请大师看看“此命盘的主人是 黑马,出生于红兔。日干代表命主,所以属 水”是什么意思...
- BGP进阶:BGP 综合实验一
- linux中cmd是什么文件格式,CMD 文件扩展名: 它是什么以及如何打开它?
- SQL中where子句中不能出现聚合函数的原因
- 软件功能测试订票系统,飞机票订票系统功能测试项目
- 有符号16进制转10进制工具分享
- Qt sqlite 使用备忘
热门文章
- 【百度地图-安卓SDK】从头开始写android程序
- windows 2003常用命令(推荐)
- linux - 查看是否安装 apache 以及 apache 版本
- 编译程序遇到问题 relocation R_X86_64_32 against `.rodata' can not be used when making a shared object;...
- 【小技巧】自定义asp.net mvc的WebFormViewEngine修改默认的目录结构
- 一步一步打造WebIM(1) (转载)
- 【面试题】---前端需要掌握的知识点-----更新...
- 【codevs1378】选课——树形动规
- YUV420查表法高效、无失真的转换为RGB32格式
- 微信公众平台开发(112) 微信卡券