定义装饰者模式

装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。这句话摘自书中,给人读得很生硬难懂。通俗地来说,装饰者和被装饰者有相同的父类,装饰者的行为组装着被装饰者的行为。

设计星巴克咖啡

代码实现

/**
* @author Lollipop
* @since 2019/11/26
*/
public abstract class Beverage {
String description = "Unknown Beverage"; public String getDescription() {
return description;
} public abstract double cost(); }
/**
* @author Lollipop
* @since 2019/11/26
*/
public abstract class CondimentDecorator extends Beverage {
/**
* 描述
* @return
*/
@Override
public abstract String getDescription();
}
/**
* @author Lollipop
* @since 2019/11/26
*/
public class Mocha extends CondimentDecorator {
private Beverage beverage; public Mocha(Beverage beverage) {
this.beverage = beverage;
} /**
* 描述
*
* @return
*/
@Override
public String getDescription() {
return "Mocha," + this.beverage.getDescription();
} @Override
public double cost() {
return 0.20 + this.beverage.cost();
}
}
/**
* @author Lollipop
* @since 2019/11/26
*/
public class Whip extends CondimentDecorator {
private Beverage beverage; public Whip(Beverage beverage) {
this.beverage = beverage;
} /**
* 描述
*
* @return
*/
@Override
public String getDescription() {
return "Whip," + this.beverage.getDescription();
} @Override
public double cost() {
return 0.10 + this.beverage.cost();
}
}

代码运行

/**
* @author Lollipop
* @since 2019/11/26
*/
public class StarbuzzCoffee {
public static void main(String[] args) {
Beverage beverage = new Espress();
beverage = new Mocha(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
System.out.println(beverage.getDescription() + " $" + beverage.cost());
}
}

运行结果

Whip,Mocha,Mocha,Unknown Beverage $1.59

总结

  1. 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
  2. 多重嵌套,导致代码复杂度高

HeadFirst设计模式---装饰者的更多相关文章

  1. 读headFirst设计模式 - 装饰者模式

    继承可以在复用父类代码的情况下扩展父类的功能,但同时继承增加了对象之间的耦合度,所以要慎用继承.那么有没有既能扩展父类的功能,又能使对象间解耦的方法呢?答案是肯定的,这就是我们今天要学习的装饰者模式. ...

  2. JAVA 设计模式 装饰者模式

    用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构

  3. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  4. HeadFirst设计模式<2>

    HeadFirst设计模式<2> 1 装饰者模式 星巴克咖啡 饮料 总结 如果说策略模式是通过组合实现弹性,那么装饰者模式就是通过继承来实现,在实现的同时,客户基本感觉不到使用了装饰者模式 ...

  5. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---适配器模式之TurkeyAdapter[转]

    适配器模式的主要意图是对现有类的接口进行转换,以满足目标类的需求.其次,可以给目标类的接口添加新的行为(主要指方法).这一点容易与装饰模式混淆.从意图方面来看,装饰模式不改变(通常指增加)接口中的行为 ...

  6. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]

     1  2{<HeadFirst设计模式>之装饰模式 }  3{ 本单元中的类为被装饰者         }  4{ 编译工具: Delphi7.0          }  5{ E-Ma ...

  7. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  8. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  9. 《HeadFirst设计模式》读后感——对学习设计模式的一些想法

    最近看完了<HeadFirst设计模式>,GOF的<设计模式——可复用面向对象软件的基础>的创建型模式也读完了,经历了从一无所知到茅塞顿开再到充满迷惑的过程. 不得不说< ...

随机推荐

  1. 字典与json转化

    json.dumps(字典)  #转成json格式 json.loads(json格式) #转成字典格式

  2. Centos 7 自动安装系统-pxe

    一.简介 PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服 ...

  3. 第十六周博客作业 <西北师范大学| 周安伟>

    第十六周作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求链接https://www.cnblogs.com/nwnu-daizh/p/10980707 ...

  4. TeamyinyinFish->鱼嘤嘤小分队软件工程beta迭代作业

    Github项目的链接 github工作组链接 github后台部分项目代码,issue提交在这个项目 github小程序前端部分项目代码链接 scrum会议时间 链接 第十一周 十一周博客 第十二周 ...

  5. 【转】Redis相关

      1. 什么是redis? Redis 是一个使用 C 语言写成的,开源的基于内存的高性能key-value数据库. Redis的值可以是由string(字符串).hash(哈希).list(列表) ...

  6. 【未完成】【oracle】存储过程按日期循环

    ............. DECLARE         V_IMPORT_DATE DATE;        V_BUSI_DATE DATE;        OUT_RET  NUMBER; - ...

  7. Vue.js 创建第一个应用

    VUE官网下载Vue.js文件或者用Vue的CDN地址 在项目中引入Vue.js文件 代码: <!doctype html> <html lang="en"> ...

  8. SVG开发注意事项

    SVG Scalable Vector Graphics 可缩放的矢量图形 起源 在 2003 年一月,SVG 1.1 被确立为 W3C 标准,在过去很长一段时间,网页注重文字和图片的展示, SVG就 ...

  9. Luogu P5363 [SDOI2019]移动金币

    话说这题放在智推里好久了的说,再不写掉对不起自己233 首先你要知道一个叫做阶梯Nim的东西,具体的可以看这篇博客 那么我们发现这和这道题的关系就很明显了,我们把两个金币之间的距离看作阶梯Nim的每一 ...

  10. 关于书籍《区块链以太坊DApp开发实战》的内容告示

    书中所列举的以太坊 etherscan 浏览器,原链接已经不能使用国内网络正常访问了,需要翻墙,下面的链接不需要翻墙,也是 etherscan 的官方浏览器链接: 以太坊浏览器:https://cn. ...