设计模式——Decorator(装饰器模式)

news2024/9/21 0:24:45

Decorator(装饰器模式)

目的:

动态地给一个对象添加一些额外的职责。

适用性:

在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

简单解释

当有一个已经完成的系统,其中类和对象的关系的错综复杂的,此时若想给某类对象添加一些额外的属性或方法(状态或职责),可能会引起其他地方的报错。
因此就需要在目标类的同一层级,新增一个与目标类继承同一父类的抽象修饰器类(方便向上转型),并且在其中包含有父类指针(方便接收目标对象)。
在这里插入图片描述
修饰器下一层的具体实现类 ConcreteDecorator 继承 Decorator,并负责具体的职责添加,可以选择添加状态(属性) addedState 或者添加行为(方法) AddedBehavior()。
而在使用中,由于 ConcreteDecorator 继承了 Decorator, Decorator 又继承自 Component ,因此对于 ConcreteDecorator 可以直接向上转型到 Component。
目标对象 ConcreteComponent 也可以向上转型到 Component,此时两者类型相同,可直接进行 “=” 操作,实现了目标对象的“职责更新”。
(但其实此时,实现更新后的新对象其结构已经不是左边的单一层级了,而是右边的修饰器的多层级了。在内存中已经是两个不同地址的引用了)

代码示例

假设原有结构有 抽象类Person ,具体实现类 Student,其职责 Operation() 为学习。

package decorator;

public class DecoratorDemo {
	public static void main(String[] args) {
		Person zhangsan = new Student("张三");
		zhangsan.Operation();
	}
}


abstract class Person{ // Component
	protected String name;
	
	abstract public void Operation(); // 职责
}

class Student extends Person{ // ConcreteComponent
	public Student(String name) {
		this.name = name;
	}
	
	@Override
	public void Operation() {
		System.out.println(name + "的职责是:学习");
	}
}
  • 输出:张三的职责是:学习

现在要新增职责 “读书”,使用修饰器实现:

package decorator;

public class DecoratorDemo {
	public static void main(String[] args) {
		Person zhangsan = new Student("张三");
		zhangsan.Operation();
		
		System.out.println("\n------------------");
		// Decorator DecoratorA = new DecoratorA(zhangsan); //向上转型到Decorator
		// Person DecoratorA = new DecoratorA(zhangsan); //向上转型到Person
		
		zhangsan = new DecoratorA(zhangsan); // Person类型相同,可以直接赋值
		zhangsan.Operation();
		
		System.out.println("\n------------------");
		zhangsan = new DecoratorB(zhangsan); // 继修饰器A添加“读书”后,在用修饰器B添加“写作业”
		zhangsan.Operation();
		
	}
}

abstract class Decorator extends Person{ // 与目标类 Student 继承统一父类 Person
	protected Person person; // 包含有父类指针
}

class DecoratorA extends Decorator{
	public DecoratorA(Person person) { // 构造函数接收目标对象
		this.person = person;
	}
	
	@Override
	public void Operation() {
		person.Operation(); // 原有的职责
		System.out.print("读书 "); // 新增职责
	}
}

class DecoratorB extends Decorator{
	public DecoratorB(Person person) { // 构造函数接收目标对象
		this.person = person;
	}
	
	@Override
	public void Operation() {
		person.Operation(); // 原有的职责
		System.out.print("写作业"); // 新增职责
	}
}

abstract class Person{ // Component
	protected String name;
	
	abstract public void Operation(); // 职责
}

class Student extends Person{ // ConcreteComponent
	public Student(String name) {
		this.name = name;
	}
	
	@Override
	public void Operation() {
		System.out.print(name + "的职责是:学习 ");
	}
}

输出:
张三的职责是:学习
------------------
张三的职责是:学习 读书
------------------
张三的职责是:学习 读书 写作业

参考

B站 zst_2001 软考设计模式

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

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

相关文章

【MySql】Mysql之备份与恢复

目录 一、mysql日志概述 1、日志类型与作用 2、日志配置文件 3、日志配置文件的查询 二、备份的类型❤ 1、物理备份 1.1 冷备份 1.2 热备份 1.3 温备份 2、逻辑备份❤ 2.1 完全备份 2.2 差异备份 2.3 增量备份 2.5 如何选择逻辑备份策略 3、常见的备份方法 3…

大模型部署手记(3)通义千问+Windows GPU

1.简介 组织机构:阿里 代码仓:GitHub - QwenLM/Qwen: The official repo of Qwen (通义千问) chat & pretrained large language model proposed by Alibaba Cloud. 模型:Qwen/Qwen-7B-Chat-Int4 下载:http://huggingface…

Modelsim测试覆盖率操作说明

1、打开Project窗口界面 2、在project界面下,选中所有需要测试覆盖率的.v文件(不包括tb文件),鼠标点击右键,在Properties选项中选择Coverage选项,选择需要测试的覆盖率类型 3、重新编译所有的源文件&#x…

【gitlab】从其他仓库创建项目

需求描述 解决方法 以renren-fast脚手架为例 第一步 第二步 第三步 第四步 参考文章

Echarts 教程二

Echarts 教程二 Echarts 常用配置篇柱状图常用配置折线图常用配置散点图常用配置饼图常用配置地图常用配置 Echarts 常用配置篇 柱状图常用配置 配置柱状图的最大最小值 平均值 显示柱状图文字 柱状图宽度 折线图常用配置 配置最大最小值 平均值 标记区域 线的平滑 线的样式 等…

苹果签名有多少种类之TF签名(TestFlight签名)是什么?优势是什么?什么场合需要应用到?

(一)TestFlight 能够让您:邀请内部和外部的测试人员为应用程序提供反馈。 跟踪应用程序在测试过程中发现的 bug 和用户体验问题。 收集 Crash 报告,了解应用程序在真实设备上的运行状况。 要使用 TestFlight,您可以按照…

用Python操作Word文档,看这一篇就对了!

本文主要讲解Python中操作word的思路。 一、Hello,world! 使用win32com需要安装pypiwin32 pip install pypiwin32 推荐使用python的IDLE,交互方便 1、如何新建文档 from win32com.client import Dispatchapp Dispatch(Word.Application…

大模型部署手记(4)MOSS+Jetson AGX Orin

1.简介 组织机构:复旦大学 代码仓:GitHub - OpenLMLab/MOSS: An open-source tool-augmented conversational language model from Fudan University 模型:fnlp/moss-moon-003-sft-int4 下载:https://huggingface.co/fnlp/mos…

【C语言】八大排序算法

文章目录 一、冒泡排序1、定义2、思想及图解3、代码 二、快速排序1、hoare版本2、挖坑法3、前后指针法4、非递归快排5、快速排序优化1)三数取中选key值2)小区间优化 三、直接插入排序1、定义2、代码 四、希尔排序1、定义2、图解3、代码 五、选择排序1、排…

Solidity 合约漏洞,价值 38BNB 漏洞分析

Solidity 合约漏洞,价值 38BNB 漏洞分析 1. 漏洞简介 https://twitter.com/NumenAlert/status/1626447469361102850 https://twitter.com/bbbb/status/1626392605264351235 2. 相关地址或交易 攻击交易: https://bscscan.com/tx/0x146586f05a451313…

(c语言进阶)数据存储——整形存储

1.Release程序运行时会对Debug程序进行优化 例如将变量创建在数组之后,避免了数组越界引用时导致死循环的可能。 2.整形变量所占空间的大小 3.构造类型 数组的类型为去掉数组名之后的剩余部分 4.指针类型 5.空类型 6.数值的不同表现形式 7.数据在内存中的两种存…

03.requests入门

1、requests概述 ​ 前面的课程中我们了解了requests模块是一个网络请求模块,可以帮助我们模拟成客户端去请求服 务器的数据。我们今天就是主要针对这个模块进行学习。 ​ 我们可以在浏览器中抓取到这些请求与响应的内容,那么我们可以“伪造”请求吗?也就是不再通过 浏览器…

python+pygame+opencv+gpt实现虚拟数字人直播(一)

AI技术突飞猛进,不断的改变着人们的工作和生活。数字人直播作为新兴形式,必将成为未来趋势,具有巨大的、广阔的、惊人的市场前景。它将不断融合创新技术和跨界合作,提供更具个性化和多样化的互动体验,成为未来的一种趋…

大模型部署手记(2)baichuan2+Windows GPU

1.简介 组织机构:百川智能(前搜狗CEO王小川创立) 代码仓:GitHub - baichuan-inc/Baichuan2: A series of large language models developed by Baichuan Intelligent Technology 模型:baichuan-inc/Baichuan2-7B-Ch…

二十九、高级IO与多路转接之epollreactor(收官!)

文章目录 一、Poll(一)定义(二)实现原理(三)优点(四)缺点 二、I/O多路转接之epoll(一)从网卡接收数据说起(二)如何知道接收了数据&…

【C++】vector相关OJ

文章目录 1. 只出现一次的数字2. 杨辉三角3. 电话号码字母组合 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 1. 只出现一次的数字 力扣链接 代码展示&#xff1a; class Solution { public:int singleNumber(vector<i…

留学生用ChatGPT改论文被教授痛骂

最近&#xff0c;随着AI的突然出世&#xff01;瞬间在澳洲及各国留学圈掀起大浪潮&#xff01;然而一则帖子也在网上火了&#xff0c;值得留学生们看看。 “用ChatGPT改论文被教授痛骂...” 这个帖子表示&#xff0c;Chat GPT真是堪称Essay的第一生产力&#xff0c;但是Chat …

Septentrio接收机二进制的BDS b2b改正数解码

Galileo的HAS和BDS B2b改正数为实时PPP提供了可能&#xff0c;要实现实时PPP解算&#xff0c;必须对对应的数据进行解码。由于没有做过解码的工作&#xff0c;现结合qzsl6tool代码对Septentrio的解码代码进行学习。 1. 二进制枕头的识别和解码 定义一个读取数据的类&#xff…

ASUS华硕天选4笔记本FA507NU7735H_4050原装出厂Win11系统

下载链接&#xff1a;https://pan.baidu.com/s/1puxQOxk4Rbno1DqxhkvzXQ?pwdhkzz 系统自带网卡、显卡、声卡等所有驱动、出厂主题壁纸、Office办公软件、MyASUS华硕电脑管家、奥创控制中心等预装程序

Java类型转换和类型提升

目录 一、类型转换 1.1 自动类型转换&#xff08;隐式&#xff09; 1.1.1 int 与 long 之间 1.1.2 float 与 double 之间 1.1.3 int 与 byte 之间 1.2 强制类型转换&#xff08;显示&#xff09; 1.2.1 int 与 long 之间 1.2.2 float 与 double 之间 1.2.3 int 与 d…