【设计模式】我终于读懂了装饰者模式。。。

news/2025/2/19 8:27:02/

文章目录

    • 👑星巴克咖啡订单项目(咖啡馆)
    • 👒装饰者模式定义
    • 👞 装饰者模式解决星巴克咖啡订单
      • 🌂装饰者模式下的订单:2 份巧克力+一份牛奶的 LongBlack
    • 💼下面我们跟着代码debug下去看一下
      • 👜这里我们new 了一个`澳式黑咖啡`
      • 👝下面我们把coffee包装到牛奶中去了
      • 👛我们进入到cost方法中去
      • 👓现在我们往下走
      • 🎣接着我们又进入到了cost方法中去
      • ☕️这个其实又变成牛奶的价格加上coffee的价格,这样一直递归下去,getDes方法也是如此
      • 🍵现在我们如果再加一种coffee(新品种)
    • 🍶装饰者模式在JDK 应用的源码分析
      • 🍼InputStream 是抽象类, 类似我们前面讲的 Drink
      • 🍺FileInputStream 是 InputStream 子类,类似我们前面的 DeCaf, LongBlack
      • 🍻 FilterInputStream 是 InputStream 子类:类似我们前面 的 Decorator 修饰者
      • 🍸DataInputStream 是 FilterInputStream 子类,具体的修饰者,类似前面的 Milk, Soy 等
      • 🍹FilterInputStream 类 有 protected volatile InputStream in; 即含被装饰者,类似前面的obj
      • 🍷 分析得出在 jdk 的 io 体系中,就是使用装饰者模式

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

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

👒装饰者模式定义

1)装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)
2)这里提到的动态的将新功能附加到对象和 ocp 原则,在后面的应用实例上会以代码的形式体现。

👞 装饰者模式解决星巴克咖啡订单

在这里插入图片描述

🌂装饰者模式下的订单:2 份巧克力+一份牛奶的 LongBlack

在这里插入图片描述

我们准备最基础的drink类,不管coffee也好,调味品也好,都继承该抽象类

在这里插入图片描述

在这里插入图片描述

准备我们的coffee类

在这里插入图片描述

在这里插入图片描述

下面有四个类型的coffee

分别是:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

然后我们还需要一个装饰者(可以理解为调味品的超类)

在这里插入图片描述

下面有三个调味品继承该类

在这里插入图片描述

分别是

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

有了这些之后就开始写我们的主方法

在这里插入图片描述
在这里插入图片描述

💼下面我们跟着代码debug下去看一下

👜这里我们new 了一个澳式黑咖啡

在这里插入图片描述
在这里插入图片描述

所以他有了描述和价格

在这里插入图片描述

👝下面我们把coffee包装到牛奶中去了

在这里插入图片描述

成为了牛奶的obj

在这里插入图片描述
在这里插入图片描述

👛我们进入到cost方法中去

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这里的getPrice就是自己的价格,然后加上obj的价格

在这里插入图片描述

描述也是自己的描述加上obj的描述

在这里插入图片描述

👓现在我们往下走

在这里插入图片描述
又把牛奶包装到了巧克力当中去,这个时候就开始套娃了,大家发现没有
在这里插入图片描述

🎣接着我们又进入到了cost方法中去

在这里插入图片描述

发现先加自己的价格

在这里插入图片描述

然后进入obj的计算价格中去

在这里插入图片描述

☕️这个其实又变成牛奶的价格加上coffee的价格,这样一直递归下去,getDes方法也是如此

在这里插入图片描述

🍵现在我们如果再加一种coffee(新品种)

在这里插入图片描述

只需要继承我们的Coffee类,然后又开始无限套娃

在这里插入图片描述

这,就是装饰者模式

🍶装饰者模式在JDK 应用的源码分析

在这里插入图片描述

🍼InputStream 是抽象类, 类似我们前面讲的 Drink

在这里插入图片描述

🍺FileInputStream 是 InputStream 子类,类似我们前面的 DeCaf, LongBlack

在这里插入图片描述

🍻 FilterInputStream 是 InputStream 子类:类似我们前面 的 Decorator 修饰者

在这里插入图片描述

🍸DataInputStream 是 FilterInputStream 子类,具体的修饰者,类似前面的 Milk, Soy 等

在这里插入图片描述

🍹FilterInputStream 类 有 protected volatile InputStream in; 即含被装饰者,类似前面的obj

在这里插入图片描述

🍷 分析得出在 jdk 的 io 体系中,就是使用装饰者模式

在这里插入图片描述

资料参考:https://www.bilibili.com/video/BV1G4411c7N4

代码地址:https://gitee.com/WangFuGui-Ma/design-pattern/tree/master/design


http://www.ppmy.cn/news/5991.html

相关文章

2022年全国职业院校技能大赛中职组网络安全竞赛试题B模块 ——wirehark数据分析与取证hack.pcapng(解析教程)

2022年全国职业院校技能大赛中职组网络安全竞赛试题B模块 wirehark数据分析与取证hack.pcapng(解析教程) wiresharek Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是检索取网络封包,并同时显示出最详细的网络封包数据。Wireshark使用WinPCAP作…

【JavaEE】【Servlet API详解】重点!!!

努力经营当下,直至未来明朗! 文章目录【Servlet API概述】【HttpServlet】【HttpServletRequest】【HttpServletResponse】写例子:表白墙表白墙参考代码小结坚持一定很酷! 【Servlet API概述】 API其实就是一组类/方法Servlet提…

移动WEB开发之响应式布局--响应式开发

响应式开发原理 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。 响应式布局容器 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。 原理就是在不同屏幕下,通过媒体查询来改变这个布局…

【深入浅出Spring原理及实战】「开发实战系列」SpringSecurity技术实战之通过注解表达式控制方法权限

Spring Security权限控制机制 Spring Security中可以通过表达式控制方法权限,其中有四个支持使用表达式的注解,分别是PreAuthorize、PostAuthorize、PreFilter和PostFilter。其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可…

发现一只常量

啊,我又来了! 我决定讲vbs(yyds!) 往期回顾(什么嘛,就一期) 关于如何创造VBS编程环境 目录 一、哎,常量是什么啊? 1. 自然常量 2、自定义常量 二、好像没有二…

想成为一名黑客怎么办?

想要成为一名黑客,首先第一点就是要坚持。怀抱着黑客英雄主义情怀,只要沿着网络安全这条河堤走,保证自己不分心,三年如一日像《一拳超人》光头侠一样坚持做黑客,你必然能成为安全攻防某个领域的专家。不管你是想做白帽…

【经典设计】构建业务架构的3大视图

​ 在软件设计过程中,架构设计、功能设计和数据设计是三个不同层次的设计工作。而业务架构是系统整体规划中重要的基础工作,通常用业务架构图来表达业务架构。 业务架构定义了企业的治理结构、业务能力、业务流程、业务数据。业务能力说明企业做什么&a…

2023年高企申报的预先准备

预申报对象 (一)2023年资格到期需重新认定的2020年度高新技术企业; (二)已排摸的拟参加高新技术企业认定的新申报企业; (三)拥有知识产权的工业、及国家科技型中小企业&#xff1b…