设计模式第三集——装饰者模式(Decorator)

  再次强调设计的重要原则:对扩展开放,对修改关闭。在设计中要尽量避免对之前源代码的修改。

  为适应扩展的特性,除了继承之外,还可以用装饰者模式:动态的将新的功能附加到对象上。换句话说,装饰者模式就是有一群装饰者类,这些类包裹起具体的组件。在java中,最典型的装饰者模式就是java I/O

 

 FileInputStream是被包装的组件,有最基本的读取字节的功能。BufferInputStream是一个具体的装饰者,它加入了两种新的行为:readLine()和缓冲输入;LineNumberInputstream也是一个具体的装饰者它在BufferInputStream之上又加入了计算行数的功能。

  具体例子:咖啡馆订单系统。咖啡馆有多款咖啡,例如HouseBllend、DarkRoast;顾客在购买咖啡时经常要求在咖啡中加上各种调料例如Streamed Milk,Mocha。根据客户不同的要求收取不同的费用。

  UML图:调料类CondimentDecortor是饮料类Beverage的装饰类。在装饰类的两种调料中,有一个实例变量Beverage,用它来记录需要包裹的实例。注意:最终的结果是经过装饰类包装之后的类,也就是说装饰类可以取代Beverage,所以装饰类CondimentDecortor必须继承自Beverage

饮料 Beverage

 1 package com.coffee;
 2 
 3 public abstract class Beverage {
 4     protected String description="Unknown Beverage";
 5     protected int Size;//1:小杯 2:中杯 3:大杯    
 6     
 7     public String getDescription() {
 8         return description;
 9     }
10         
11     public int getSize() {
12         return Size;
13     }
14     
15     public abstract double cost();//cost在子类中实现
16         
17 
18 }

HouseBlend咖啡具体实现饮料类

 1 package com.coffee;
 2 
 3 public class HouseBlend extends Beverage{
 4     public HouseBlend(int size) {
 5         description="HouseBlend";
 6         Size=size;
 7         if(getSize()==1){
 8             description+="Small";
 9         }else if(getSize()==2){
10             description+="Middle";
11         }else if(getSize()==3){
12             description+="Large";
13         }
14     }
15 
16     public double cost() {
17         double Cost=1.99;
18         if(getSize()==1){
19             Cost+=1.0;
20         }else if(getSize()==2){
21             Cost+=2.0;
22         }else if(getSize()==3){
23             Cost+=3.0;
24         }
25         return Cost;
26     }
27     
28 }

调料装饰类CondimentDecorator

1 package com.condiment;
2 
3 import com.coffee.Beverage;
4 
5 public abstract class CondimentDecorator extends Beverage {
6     public abstract String getDescription();
7     public abstract int getSize();
8 
9 }

Mocha调料实现CondimentDecorator

 1 package com.condiment;
 2 
 3 import com.coffee.Beverage;
 4 
 5 public class Mocha extends CondimentDecorator{
 6     Beverage beverage;
 7     
 8     public Mocha(Beverage beverage) {
 9         this.beverage = beverage;
10     }
11     
12     public int getSize(){
13         return Size;        
14     }
15 
16     public String getDescription() {
17         // TODO Auto-generated method stub
18         String order="Order:";
19         if(getSize()==1){
20             order+="Small";
21         }else if(getSize()==2){
22             order+="Middle";
23         }else if(getSize()==3){
24             order+="Large";
25         }
26         return order+beverage.getDescription()+",Mocha";
27     }
28 
29     
30     public double cost() {
31         // TODO Auto-generated method stub
32         double cost=beverage.cost()+.20;//取得之前饮料的加个加上摩卡的加个.20
33         if(getSize()==1){
34             cost+=1.0;
35         }else if(getSize()==2){
36             cost+=2.0;
37         }else if(getSize()==3){
38             cost+=3.0;
39         }
40         return cost;
41     }
42 
43 }

 

转载于:https://www.cnblogs.com/doublesong/archive/2012/07/30/2614984.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI开放只是幌子?科技巨头边承诺开放边申请专利

选自 I Wired编译 I 网易智能参与 I 木秀林据《连线》报道,上周在旧金山举行的谷歌云计算会议上,该公司CEO桑德尔皮查伊提到公司致力于人工智能(AI)的开放。他表示:“我们创立开放的平台,分享我们的技术&am…

两种列式存储格式:Parquet和ORC

背景 随着大数据时代的到来,越来越多的数据流向了Hadoop生态圈,同时对于能够快速的从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要,在Hadoop生态圈的快速发展过程中,涌现了一批开源的数据分析引擎&#…

数据链路层(学习笔记)

首先要明确“数据链路”和“链路”这两个概念: 链路:从一个节点到相邻节点的一段物理现路,其中间没有任何的交换节点,所以可以说链路只是一条路径的组成部分。   数据链路:当需要在一条线路上传送数据的时候&#xf…

免otp动态密码登录堡垒机

环境准备 安装brew 参考文档:https://brew.sh/index_zh-cn.html 安装oath-toolkit 和expect brew install oath-toolkit brew install expect 正式开始 生成MFA_KEY对应的6位otp密码:oathtool -b --totp [MFA_KEY] MFA_KEY就是你绑定APP时&#x…

英特尔10纳米处理器再度跳票,或收缩芯片代工业务

来源:腾讯科技摘要:在全球半导体行业,线宽(N纳米)是制造厂商进行激烈竞争的指标。在全球半导体行业,线宽(N纳米)是制造厂商进行激烈竞争的指标。据报道,英特尔将延期到20…

简单GDB调试

GDB下载 使用yum工具直接下载 生成可用gdb调试的可执行程序 -g 会保留源文件中的函数名和变量名 启动gdb gdb 可执行程序名 set args xxx xxx 给程序传参查看程序中的源代码 当前文件 l(list) l 行号 l 函数名 非当前文件 l 文件名:行号 l 文件名&#xf…

人工智能应用需要高可信性(180806)

来源:科学网摘要:近日,“Rekognition”却闹了一个大乌龙:28名美国国会议员被它识别成了罪犯。小编搞了大半辈子测试和容错,对这方面消息比较敏感。最近看到新闻,商业巨头亚马逊2016年推出图像识别AI系统“R…

暑假集训中期测试 Problem D: 装箱问题2 (并查集)

Description 有很多个棱长为1的正方体货物整齐地堆在一堆。不过有一些是悬空的, 大概是粘上去的吧。。。 给出这些货物的相邻关系,求最小的长方体(或正方体)能装下这些货物的集装箱的体积,(集装箱棱长方向与…

s3cmd安装及使用

一、安装 1.下载安装包。 这里我们使用s3cmd-1.0.0.tar.gz安装包 2.解压安装包 tar xzvf s3cmd-1.0.0.tar.gz 3.移动路径 mv s3cmd-1.0.0 /usr/local/s3cmd 4.创建软链接 ln -s /usr/local/s3cmd/s3cmd /usr/bin/s3cmd 5.执行配置命令(按提示输入相应密码等) s3cmd -…

二叉树——堆

二叉树顺序存储结构 理解堆之前先理解一下二叉树的顺序存储结构。普通的二叉树并不适合顺序存储,因为可能会造成大量的空间浪费。只有完全二叉树适合顺序结构存储。显示中我们通常把堆使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统中虚拟进程…

open AI 在DOTA 5v5 比赛中战胜职业选手

来源:AI科技大本营摘要:去年,OpenAI 在 DOTA 的 1v1 比赛中战胜了职业玩家 Dendi,而在距离进阶版 OpenAI Five 系统战胜人类业余玩家不过一个月的时间,今天凌晨,它又以 2:1 的战绩再次完成对人类高级玩家的…

如何体现机器智能和群体智能的关系,2018新版互联网大脑模型绘制

作者:刘锋 计算机博士 互联网进化论作者2018年新的这一版,也是互联网大脑模型图的第五个版本,距离第一版的发布已经有10年时间(2008年),距离上一版第四版也有1年时间,在这一版中主要解决了如何…

全球互联正在创造一个知识极大丰富和隐私终结的时代

来源:资本实验室摘要:据预测,到2020年,全球物联网连接设备将超过500亿个,会产生600泽字节的信息。这么庞大的数据量,将如何影响并改变我们的生活和工作?聚焦前沿科技创新与传统产业升级据预测&a…

泡沫破裂之后,强化学习路在何方?

作者|侯宇清、陈玉荣来源|智能单元编辑|Debra一、深度强化学习的泡沫2015 年,DeepMind 的 Volodymyr Mnih 等研究员在《自然》杂志上发表论文 Human-level control through deep reinforcement learning[1],该论文提出…

一篇文章搞懂数据仓库:维度表(设计原则、设计方法)

目录 1、什么是维度表? 2、维度表设计原则 (1)维度属性尽量丰富,为数据使用打下基础 (2)给出详实的、富有意义的文字描述 (3)区分数值型属性和事实 (4)…

Github项目:AI消除马赛克实战

目录 1、原理 2、准备工作 3、消除马赛克 4、效果对比 1、原理 该算法利用线性盒滤波器分别处理每个块的事实。对于每个块,它将搜索图像中的所有块像素化以检查直接匹配。 对于大多数像素化图像,Depix能够找到单个匹配结果。它假设这些是正确的。然…

C++继承一览

继承的概念及定义 继承机制是面向对象程序设计是代码可以复用的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生的类称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。…

人工智能能否复制人脑引争论 美媒:目前AI仍存在局限性

来源:网易智能摘要:人们应用人工智能技术(AI)的所有领域,包括无人驾驶汽车、机器人医生、超过10亿中国公民的社会信用评分系统等,当前都取决于一场关于如何让AI做其不能做的事的辩论。8月6日报道称&#xf…

Tushare免费获取股票数据:实时数据,历史数据,行情数据

一 操作手册 引导用户顺利开始使用Tushare Pro数据,以下步骤将带您开始Tushare数据之旅: 用户注册登录后可调用数据:https://tushare.pro/register?reg399205 二 如何获取TOKEN凭证 1、登录成功后,点击右上角->个人主页 2、…

排序(冒泡、选择、插入、希尔、快排、堆排、归并)

冒泡排序 冒泡排序时通过无序区中相邻记录的关键字间的比较和位置的交换,使关键字最小的元素如气泡似的逐步上浮直水面。有序区逐渐扩大,无序区逐渐缩小。   冒泡排序算法的原理如下: 比较相邻的元素。如果第一个比第二个大,就…