装饰者模式(Decorator Pattern)

1 什么是装饰者模式?

1.1 Head First Design Pattern 定义

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

1.2 大佬博客

设计模式是什么鬼(装饰)

2 装饰者模式

2.1 基本介绍

参考《Head First Design Pattern》第二版,使用其中的例子来进行时间,首先来看看 UML 图
image.png
(1)该图最上面是 Component 抽象类,是所有类基类,下面的每一个类都是它的子类
(2)左边的 ConcreteComponent 是积累的具体类,这些类是真正需要被修饰的类;
(3)右边 Decorator 是装饰器的父类,所有装饰器都需要继承这个类
(3.1)这个类需要继承 Component 基类
(3.2)同时,对 Component 类中的非抽象方法,且必须要子类重写的方法,可以在这个 Decorator 类中将其声明为抽象方法;
(4)Decorator 类下的子类就是具体的装饰器
(4.1)这些装饰器必须实现 Component 和 Decorator 类中的抽象方法
(4.2)这些类实际上也是基类 Component 的对象,只不过加了一些特殊的东西;

2.2 实例的 UML 图

image.png
在《Head First Design Pattern》这本书中,实现方式是使用抽象类实现的;但是还有一种上层使用接口的方式实现的;

2.3 使用抽象类实现方式

2.3.1 各个类的结构关系

image.png
Espresso.png

2.3.2 具体代码实现

wangs/设计模式

2.3.3 小结

(1)基本类:最上层的基本类中可以有非抽象方法,该方法在基本类中实现基本的需求,但是又希望子类去重写它,而且必须重写,可以使用在装饰器的抽象类中将该方法声明为抽象方法;
(2)装饰器抽象类:该类主要是起一个规范作用,将所有装饰器需要实现的方法,而基本类中不是抽象方法的方法在此处声明;该类需要继承基本类;
(3)具体组件:这些组件是对基本类的具体实现,因为基本类是抽象类,不能实例化,真正被装饰的其实是这些子类
(4)装饰器的父类是抽象方法,在这个设计中,我们将基本类的引用放在了每个具体的装饰器中实现。


2.4 使用接口实现

2.4.1 各个类的结构关系

image.png
Showable.png

2.4.2 具体代码实现

wangs/设计模式

2.4.3 小结

(1)最上层是一个接口,该接口中列举所有装饰器以及具体被装饰对象需要实现的方法;我将其看作是一个规范接口,通过这个接口,可以很容易看出装饰器这些类中需要实现什么方法;
(2)基本类:基本类直接实现这个接口,不是抽象类;接口方法只做简单的实现,不做任何特别的处理;
(3)被装饰对象:直接继承基本类,并且按需求实现最顶层接口中的方法;
(4)装饰器的父类:这个类直接继承基本类,在该类中定义一个最上层接口的引用或者是基本类的引用,并使用有参构造的方式为该类注入一个基本类的参数;
(5)装饰器:各个装饰器继承装饰器的父类,并且强制给出一个带参的构造器,在构造器中使用 super 调用父类构造器,注入参数;并且实现接口中的类方法,也可以按需求增加额外的方法;


3 总结

3.1 个人理解

装饰器就是在不改变基本类型的情况下,增加新的类别,为该类别添加一个新的属性,或者新的特性,但是从继承关系上来看,任然属于基本类,即任然还是基本类的东西;这种方式利于增加类别,并且可以根据现有的装饰类,来组合更多的不同类别;

3.2 装饰器模式的应用

(1)Java 中的 IO 流

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

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

相关文章

Goby 漏洞发布| 亿赛通电子文档安全管理系统 LinkFilterService 接口权限绕过漏洞

漏洞名称:亿赛通电子文档安全管理系统 LinkFilterService 接口权限绕过漏洞 English Name:Esafenet Electronic Document Security Management System LinkFilterService API Permission Bypass Vulnerability CVSS core: 9.3 影响资产数:…

MySQL BinLog 数据还原恢复

博文目录 文章目录 查看状态查看 binlog 开关及存储路径查看 binlog 配置 如 存储格式 binlog_format查看当前还存在的日志查看当前正在使用的日志 切换日志确定日志确定日志文件日志格式改写日志简要说明确定日志位置以事件为单位查看日志分析日志 还原数据 查看状态 查看 b…

智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.花授粉算法4.实验参数设定5.算法结果6.参考文…

设计模式(2)--对象创建(1)--抽象工厂

1. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 2. 四种角色 抽象产品(Product)、具体产品(Concrete Product)、抽象工厂(Abstract Factory)、具体工厂(Concrete Factory)。 3. 优点 3.1 分离了具体的类。Client只需使用抽象工厂类…

解析代理IP在跨境电商和社媒营销中的关键作用

跨境电商和社媒营销领域的从业者深知,代理IP的价值愈发凸显。在推广营销的过程中,频繁遇到因IP关联而封禁账号的情况,或因使用不安全IP而导致异常问题。 这些问题促使人们开始高度重视代理IP的作用。但实际上,代理IP究竟是何物&a…

(数据结构)单链表的定义

#include<stdio.h> typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //LNode为结构体类型&#xff0c;LinkList为指向单链表的指针 //初始化一个空的单链表 void InitList(LinkList L) {L NULL; //空表&#xff0c;暂时没有任何节点 } //判断单…

SCUM私人服务器搭建部署教程

以下是搭建SCUM私服的步骤&#xff1a; 1. 下载并安装SteamCMD。SteamCMD是一个命令行工具&#xff0c;用于从Steam下载和更新游戏服务器。你可以从Steam官网下载并安装它。 2. 创建一个文件夹来存储服务器文件。在你的计算机上创建一个文件夹&#xff0c;用于存储SCUM服务器文…

面试拼多多前端开发岗,已拿到offer,这些知识点该放出来了

一面&#xff1a; CSS 1.盒模型 2.css文件中开头加*号/上下盒子重叠问题&#xff08;为正值如何/负值如何&#xff09; 3.伪类和伪元素的了解&#xff0c;伪类有什么作用 JS 4.原型链 5.继承 6.为什么3.tostring()会报错 7.var先使用会怎样 8.函数表达式和函数声明有…

MistralAI发布全球首个MoE大模型-Mixtral 8x7B,创新超越GPT-4

引言 MistralAI&#xff0c;一家法国的初创企业&#xff0c;近期在AI界引发了轰动&#xff0c;刚刚发布了全球首个基于MoE&#xff08;Mixture of Experts&#xff0c;混合专家&#xff09;技术的大型语言模型——Mistral-8x7B-MoE。这一里程碑事件标志着AI技术的一个重要突破…

第一次提交代码到git仓库

本地搭建VUE项目&#xff0c;相关配置后&#xff0c;需要把项目代码推到github仓库上。 领导建好仓库后&#xff0c;在vscode执行以下命令&#xff0c;把项目推上去。 git init // 1. 初始化项目文件夹git add . // 2. 将所有文件添加到暂存区git commit -m "first co…

flex布局,换行的元素上下设置间距

要生成的效果图如下&#xff1a; display:flexflex-direction: row;flex-wrap: wrap;当我们使用弹性盒子布局后&#xff0c;默认元素是没有外边距的&#xff0c;紧挨着样式就有点丑&#xff0c;如果想使换行后&#xff0c;元素的外边距有个距离&#xff0c;可以用如下方法解决…

【无标题】树莓派 4B 多串口配置

0. 实验准备以及原理 0.1 实验准备 安装树莓派官方系统的树莓派 4B&#xff0c;有 python 环境&#xff0c;安装了 serial 库 杜邦线若干 屏幕或者可以使用 VNC 进入到树莓派的图形界面 0.2 原理 树莓派 4B 有 UART0&#xff08;PL011&#xff09;、UART1&#xff08;mini UAR…

散点图,何须图,折线图混放在一个echarts

散点图&#xff0c;何须图&#xff0c;折线图混放在一个echarts option {tooltip: {trigger: axis,axisPointer: {type: cross,crossStyle: {color: #999}}},legend: {data:[盒须图1,盒须图2,折线图,散点图]},xAxis: [{type: category,data: [周一,周二,周三,周四,周五,周六…

【Linux】tmux简单使用

它允许你在一个终端窗口中创建多个终端会话&#xff0c;并在它们之间进行切换。以下是tmux的一些主要用途和功能&#xff1a; 多窗口&#xff1a; Tmux允许你在一个终端中创建多个窗口。每个窗口可以包含一个或多个终端会话&#xff0c;你可以轻松地在这些窗口之间切换。面板分…

学习数据结构第一步(必看)——初识集合框架

一&#xff0c;学习数据结构前置知识 目录 一&#xff0c;学习数据结构前置知识 二&#xff0c;什么是数据结构&#xff1f; 1.什么是数据结构&#xff1f; 2.容器背后对应的数据结构 3.相关Java知识 4.什么是算法&#xff1f; 三&#xff0c;什么是集合&#xff1f; …

【lombok】从easyExcel read不到值到cglib @Accessors(chain = true)隐藏的大坑

背景: 在一次使用easyExcel.read 读取excel时&#xff0c;发现实体类字段没有值&#xff0c;在反复测试后&#xff0c;发现去掉Accessors(chain true)就正常了&#xff0c;为了验证原因&#xff0c;进行了一次代码跟踪 由于调用链路特别长&#xff0c;只列举出部分代码&#x…

Halcon参考手册语义分割和边缘提取知识总结

1.1 语义分割和边缘提取介绍 通过语义分割&#xff0c;我们使用深度学习(DL)网络将输入图像的每个像素分配给一个类。 图(1)语义分割示例 在图(1)中&#xff0c;输入图像的每个像素都被分配给一个类&#xff0c;但是苹果的三个不同实例和橘子的两个不同实例都不是可区分的对象…

Canal实时同步MySQL数据到ES

一、canal简介 canal主要用途是对MySQL数据库增量日志进行解析&#xff0c;提供增量数据的订阅和消费&#xff0c;简单说就是可以对MySQL的增量数据进行实时同步&#xff0c;支持同步到MySQL、Elasticsearch、HBase等数据存储中去。 早期阿里巴巴因为杭州和美国双机房部署&…

typescript个人学习笔记

https://ts.xcatliu.com/basics/primitive-data-types.html 深受启发 1.剑谱第一页&#xff0c;初始化ts outDir表示把ts编译成js文件&#xff0c;文件编译后存放的位置 2.类型声明 undefined可以赋值给其他类型

企业电子招投标采购系统源码之鸿鹄电子招投标系统+电子招投标的组成

鸿鹄招投标系统的功能描述 1、门户管理&#xff1a;用户可通过门户页面查看所有公告信息及相关通知信息&#xff0c;包括招标公告、非招标公告、系统通知和政策法规等板块。 2、立项管理&#xff1a;企业用户可以对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0…