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

news2025/1/15 20:52:13

文章目录

    • 👑星巴克咖啡订单项目(咖啡馆)
    • 👒装饰者模式定义
    • 👞 装饰者模式解决星巴克咖啡订单
      • 🌂装饰者模式下的订单: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.coloradmin.cn/o/110003.html

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

相关文章

五、Kubernetes命令行工具 (kubectl)

1、概述 kubectl 是 Kubernetes 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能 够在集群上进行容器化应用的安装部署。 2、语法 使用以下语法从终端窗口运行 kubectl 命令: kubectl [command] [TYPE] [NAME] [flags] 其中 …

PPCNN

这是细粒度特征提取和定位用于目标检测,近年来,深度卷积神经网络在计算机视觉上取得了优异的性能。深度卷积神经网络以精确地分类目标信息而闻名,并采用了简单的卷积体系结构来降低图层的复杂性,基于深度卷积神经网络概念设计的VG…

二叉树遍历

题目:二叉树的遍历 解法一:递归遍历,也是实现起来,最简单的方式。 写递归算法的核心三大要素:1.确定递归函数的参数 和 返回值。都是关键的信息。 2.确定终止条件。用心思考,到底啥才是本次递归终止的条件…

keras的模型可视化

参考:https://blog.csdn.net/chenxy_bwave/article/details/121955478 from tensorflow.keras import utils utils.plot_model(model, model_cnnppt.png,show_shapesTrue,show_dtypeTrue,show_layer_namesTrue)两行代码,效果惊艳。 但是这样也有一个弊…

酒店好评回复模板

网评是酒店线上口碑的体现,好评率高可以提高客户入住率,而酒店对网评的回复也很关键,酒店要重视好评的回复。 前言 住酒店存在于在我们日常生活的很多场景中,比如:旅游入住酒店、出差办公也会入住酒店等等&#xff0c…

【NumPy 数组过滤、NumPy 中的随机数、NumPy ufuncs】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…

rabbitmq基础5——集群节点类型、集群节基础运维,集群管理命令

文章目录一、集群节点类型1.1 内存节点1.2 磁盘节点二、集群基础运维2.1 剔除单个节点2.1.1 集群正常踢出正常节点2.1.2 服务器异常宕机踢出节点2.1.3 集群正常重置并踢出节点2.2 集群节点版本升级2.3 集群某单节点故障恢复2.3.1 机器硬件故障2.3.2 机器掉电2.3.3 网络故障2.3.…

WPF使用快捷键 资源 输入快捷键与资源绑定 资源绑定调用操作 或keydown处理

winform直接&D就OK,还是没有winform方便。 方式1&#xff1a; 资源 输入快捷键与资源绑定 资源绑定调用操作 <Window.Resources><RoutedUICommand x:Key"download" Text"download"/></Window.Resources><Window.InputBindings>…

现在的时代不是互联网时代的延续,因为其底层逻辑已经改变

拥抱实体经济&#xff0c;绝对是当下互联网玩家们的首要选择。无论是头部的互联网企业来讲&#xff0c;还是新生的互联网玩家而言&#xff0c;它们都不约而同地将关注的焦点聚焦在了这样一个方向上。   透过这一点&#xff0c;我们可以非常明显地感受到&#xff0c;一个全新的…

Rust 语言的全链路追踪库 tracing

在一个应用程序或库的开发过程中&#xff0c;除了其本身的逻辑以外&#xff0c;开发人员还需要做很多额外的工作&#xff0c;以保证编写的代码可以正确的运行&#xff0c;或者在出错时可以快速定位到错误的位置以及原因&#xff0c;这就需要引入一些额外的工具&#xff0c;trac…

Verilog刷题HDLBits——Exams/ece241 2014 q5a

Verilog刷题HDLBits——Exams/ece241 2014 q5a题目描述代码结果题目描述 You are to design a one-input one-output serial 2’s complementer Moore state machine. The input (x) is a series of bits (one per clock cycle) beginning with the least-significant bit of …

HistoSeg:具有多损失函数的快速注意,用于数字组织学图像中的多结构分割

摘要 大多数分割网络都是基于编解码的网络结构&#xff0c;也利用了复杂的注意力模块或者Trasnsformer模块。但是这些网络在捕获相关的局部和全局特征时还不够准确。无法在多个尺度上进行准确的边界检测。因此&#xff0c;我们提出了一个编码器-解码器网络&#xff0c;快速注意…

【C++11】可变参数和lambda表达式

目录 1.可变参数模板 1.1可变参数的模板 1.2参数包的展开方式 1.21递归函数展开参数包 1.3逗号表达式展开参数包 2.STL库中的emplace相关接口 3.lambda表达式 3.1lambda的引入 3.2lambda的介绍 列表使用 lambda 表达式捕获 lambda实现swap函数 lambda表达式之间…

开放路径最短优先协议OSPF(计算机网络)

​ 目录 开放最短路径优先(Open Shortest Path First) 链路状态算法 链路状态算法 链路状态数据库(link-state database) OSPF的分组类型 类型1&#xff1a;问候(Hello)分组 类型2&#xff1a;数据库描述(Database Description)分组 类型3&#xff1a;链路状态请求(Li…

Adobe 2023全家桶12月版本更新

Adobe 2023全家桶12月版本更新 Adobe 2023 发布有两个多月了&#xff0c;您们用上了新版本吗&#xff1f;12月又迎来了一次小版本更新&#xff0c;主要更新还是对已知问题的修复&#xff0c;当然也少不了一些新功能更新。 最新的Adobe2023全家桶&#xff0c;有更强大的内容&am…

SAP ABAP——SAP简介(二)【SAP主要产品时间线】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

知识图谱库汇总!——教育领域能够直接应用的知识图谱

教育领域开源的知识图谱实体 在教育领域,有许多开源的知识图谱实体可供使用。下面列出了一些例子: DBpedia:这是一个知识图谱,由 Wikipedia 的内容构建而成。DBpedia 中包含了许多关于人、地方、事物和概念的实体,并且这些实体都具有相关的属性和关系。 Wikidata:这是一个…

智牛股_第9章_CEPH_Swift+文件上传与下载

智牛股_第9章_CEPH_Swift文件上传与下载 文章目录智牛股_第9章_CEPH_Swift文件上传与下载学习目标第1章 CEPH Swift Api实践1. 目标2. 步骤3. 实现3.1 Ceph Swift Api 实践说明3.2 Ceph Swift Api 特点3.3 Ceph RGW 介绍3.4 Ceph 存储结构3.5 Ceph Swift Api 服务端的配置3.6 C…

计算机网络~物理层

一、物理层基本概念 1. 物理层接口特性 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体物理层主要任务&#xff1a;确定与传输媒体接口有关的一些特性(定义标准) 机械特性&#xff1a;定义屋里连接的特性&#xff0c;规定物理…

多播网络(Multicast)应用权限

本文介绍如何在苹果开发者官网申请 多播网络&#xff08;Multicast&#xff09;应用权限&#xff0c;从而正常使用 Wi-Fi 快连配网功能。本文适用于 iOS 版本的 OEM App 或者其他有相同需求的 App。 背景信息 Wi-Fi 快连配网又称 快连模式&#xff08;Easy-Connect&#xff0…