文章目录

  • 一、需求
  • 二、装饰者方法
  • 三、装饰者模式的JDK应用

笔记来源: 尚硅谷

一、需求

星巴克咖啡订单项目(咖啡馆) :

  1. 咖啡种类/单品咖啡: Espresso(意大利浓咖啡)、 ShortBlack、 LongBlack(美式
    咖啡)、Decaf(无因咖啡)
  2. 调料: Milk、 Soy(豆浆)、 Chocolate
  3. 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便
  4. 使用面向对象的方法来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以单品咖
    啡+调料组合。

二、装饰者方法

说明

  1. Drink类就是抽象类
  2. LongBlack是单品咖啡
  3. Decorator是一一个装饰类,含有一个被装饰的对象(Drink obj)
  4. Decorator的cost方法进行一个费用的叠加计算,递归的计算价格

Drink类:

public abstract class Drink {private String des;//描述private float price = 0.0f;//计算费用的抽象方法//子类实现public abstract float cost();public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public String getDes() {return des;}public void setDes(String des) {this.des = des;}
}

创建LongBlack(美式咖啡)类来继承Drink:

public class LongBlack extends Drink{public LongBlack() {setDes("LongBlack");this.setPrice(10.0f);}@Overridepublic float cost() {return getPrice();}
}

创建装饰者:

public class Decorator extends Drink {private Drink obj;//组合Drinkpublic Decorator(Drink obj) {this.obj = obj;}@Overridepublic float cost() {//getPrice()自己的价格//递归计算costreturn super.getPrice() + obj.cost();}@Overridepublic String getDes() {return des + " " + super.getPrice() + " " + obj.getDes();}
}

创建装饰者特例Milk:

public class Milk extends Decorator {public Milk(Drink obj) {super(obj);setDes("牛奶");setPrice(3.0f);}
}

Client调用示例如下:

public class Client {public static void main(String[] args) {//点一杯美式咖啡Drink drink = new LongBlack();//点牛奶调料drink = new Milk(drink);//点牛奶调料drink = new Milk(drink);//计算价格System.out.println(drink.cost());}
}

输出如下:


三、装饰者模式的JDK应用

在 JDK 的 I/O中,我们列举出部分关系(FilterInpuStream相当于Decorator):

// FilterInpuStream相当于Decorator,充当了装饰者
//  (version 1.8 : 52.0, super bit)
public class java.io.FilterInputStream extends java.io.InputStream {// Field descriptor #25 Ljava/io/InputStream;protected volatile java.io.InputStream in;    //--组合了InputStream// Method descriptor #26 (Ljava/io/InputStream;)V// Stack: 2, Locals: 2protected FilterInputStream(java.io.InputStream arg0);/*省略*/
}

尚硅谷设计模式笔记-装饰者模式相关推荐

  1. 尚硅谷设计模式笔记-适配器模式

    Table of Contents generated with DocToc 一.生活中的适配器 二.程序中的适配器模式 2.1 基本介绍 2.2 工作原理 三.类适配器模式 3.1 应用实例 3. ...

  2. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  3. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

  4. 尚硅谷_CSS3 笔记

    目录 什么是CSS3 选择器 基本选择器及其扩展 属性选择器 伪类与伪元素选择器 css声明的优先级 自定义字体&字体图标 复习1 新的UI方案 文本新增样式 opacity RGBA 文字阴 ...

  5. B站MySQL(尚硅谷)学习笔记

    B站MySQL基础(尚硅谷)学习笔记 最近在学习数据库技术,并且把视频中的知识点进行了汇总,字数较多,仅供参考. 会持续更新 欢迎读者提出问题与错误,一起交流~ 视频前几集所讲述的基本知识: DB:数 ...

  6. 尚硅谷JavaSE笔记(四)

    系列文章目录 尚硅谷JavaSE笔记(一) 尚硅谷JavaSE笔记(二) 尚硅谷JavaSE笔记(三) 尚硅谷JavaSE笔记(四) 文章目录 十六.File 类与 IO 流 1.java.io.Fi ...

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

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

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

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

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

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

最新文章

  1. Social learning With Bayesian Agent and Random Decision Making
  2. 阿里全球数学竞赛第二届
  3. BZOJ1563:[NOI2009]诗人小G(决策单调性DP)
  4. JavaScript最全的10种跨域共享的方法
  5. richtextbox自动滚动到最下面_软网app:滚动截图将超长网页“一网打尽”
  6. xhtml文件的后缀名是什么?
  7. redis集群连接 java_Redis分布式集群和直连的Java客户端调用方式详解
  8. 用python效率办公_如何用Python提高办公(Excel)效率?
  9. 业务逻辑实现方式的讨论:存储过程 good or bad?
  10. 单片机的c语言程序控制直流电机,(单片机控制直流电机)毕业论文.doc
  11. (转)清华学霸演讲稿:永远不要说你已经尽力了
  12. 远程计算机用户名win7,Win7远程桌面连接设置的方法
  13. 拼多多API接口(附上我的可用API)
  14. 关于《未来软件是什么样子?》一文的讨论(2)
  15. Keil工程文件建立以及.hex文件的生成
  16. 如何求出二次贝塞尔曲线上面的各个点呢
  17. Android8.0 WIFI ap Tethering 相关知识
  18. 如何设置和取消Mac电脑的开机密码?
  19. [2021]Linux下C语言qrencode二维码生成库的基本使用和ARM开发板移植
  20. 尼古拉·特斯拉,到底有多神?

热门文章

  1. 自学python到什么程度可以找工作-Python学到什么程度才可以去找工作?掌握这4点足够了!...
  2. python下载安装教程-Python和Anoconda和Pycharm安装教程
  3. 0基础学python要多久-零基础学Python的过程有多难?需要多久?
  4. python语言-Python Insider
  5. 本地语音识别_语音 识别_语音识别 - 云+社区 - 腾讯云
  6. c语言写贪吃蛇什么水平_细致的C语言写贪吃蛇教程+详细思路-适合新手附源码...
  7. jQuery-dom和jQuery,入口函数(基本知识)
  8. oracle rac 启动失败has,oracle11.2.0.4 rac asm启动故障
  9. oracle plsql创建表空间,Oracle在PLSQL Developer上创建表空间和用户脚本 - 龙卷风的日志 - 网易博客...
  10. 语言密码加密变星号_为什么汉字不能设成密码,你想过吗?