【设计模式】 - 结构型模式 - 装饰者模式

news2024/11/28 16:45:49

装饰者模式

概述

指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。
装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为

结构

Component:可以是接口或者是抽象类,被装饰的原始对象
ConcreteComponent:组件具体实现类。Component的具体实现,被装饰的具体对象【即包含原有功能的对象】。
Decorator:抽象装饰者,新增装饰类,用来扩展原有Component类的功能,对于Component来说无须知道Decorator的存在,所以在它的属性中必然有一个private变量指向Component抽象组件。
ConcreteDecorator:装饰者的具体实现类
在这里插入图片描述

实现

被装饰的原始对象
我们先定义一个人的抽象类,里面有运动的抽象方法

public abstract class Person {
	/**
	 * Person 人有可以运动的抽象方法
 	 */
	public abstract void sport();
}

被装饰的具体对象
这里是具体的一个普通人,作为一个普通人他当然会运动,当然在未被装饰的情况下他只会走路。

public class CommonPerson extends Person {
	@Override
	public void sport() {
		System.out.println("普通人运动只会走路");
	}
}

抽象装饰者
抽象装饰者保证了一个对抽象组件的引用,方便调用被装饰对象中的方法。在这里运动大师需要持有人(Person)的引用,方便教授他其他运动,最终成为运动健将。

public abstract class Master extends Person {

	private Person mPerson;
	
	public Master(Person person) {
		mPerson = person;
	}
	
	@Override
	public void sport() {
		mPerson.sport();
	}
}

装饰者具体实现类
这里有两个装饰者具体实现类,分别是宁泽涛跟邹市明,他们(装饰者)负责向普通人(被装饰者)教授游泳跟拳击。

public class Ningzetao extends Master {
	public Ningzetao(Person person){
		super(person);
	}
	@Override
	public void sport() {
		super.sport();
		teachSwimming();
	}
	public void teachSwimming(){
		System.out.println("宁泽涛教普通人游泳");
	}
}
public class Zoushiming extends Master {
	public Zoushiming(Person person){
		super(person)
	}
	@Override
	public void sport() {
		super.sport();
		teachBoxing();
	}
	public void teachBoxing(){
		System.out.println("邹市明教普通人拳击");
	}
}

客户端调用

public class Client {
	public static void main (String[] args) {
		//创建普通人,只会走路
		CommonPerson mCommonPerson = new CommonPerson();
		
		//宁泽涛教普通人学游泳,普通人学会了游泳
		Ningzetao mNingzetao = new Ningzetao(mCommonPerson);
		mNingzetao.sport();
		
		//邹市明教普通人学拳击,普通人学会了拳击
		Zoushiming mZoushiming = new Zoushiming(mCommonPerson);
		mZoushiming.sport();
	}
}

优点

装饰者模式比继承更具良好的扩展性,完美的遵循开闭原则,继承是静态的附加责任,装饰者则是动态的附加责任。
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

应用场景

  1. 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。
    不能采用继承的情况主要有两类:
    第一类是系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;
    第二类是因为类定义不能继承(如final类)
  2. 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  3. 当对象的功能要求可以动态地添加,也可以再动态地撤销时。

参考链接:https://blog.csdn.net/jason0539/article/details/22713711
https://blog.csdn.net/u012440207/article/details/111070772

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

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

相关文章

膜拜,Alibaba最新发布SprinBoot:进阶原理实战与面试题分析指南

为什么要写这本书? 我们知道,Spring Boot是一个集成性的开源框架,内部整合了很多第三方组件和框架。这些组件和框架应用如此之广泛,以至于大家反而往往对如何更好地使用Spring Boot自身的功能特性并不是很重视。事实上&#xff0…

CubeMX+VSCode+Ozone的STM32开发工作流(一)背景知识介绍

neozng1hnu.edu.cn TODO:1. 添加一键编译启用ozone调试/一键编译下载的脚本,使得整个进一步流程自动化2. 增加更多的背景知识介绍3. 增加VSCode下RTT viewer的支持和一键下载(不进入调试)的支持前言 了解过嵌入式开发的你一定接触过Keil,这款…

[附源码]java毕业设计校园求职与招聘系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

单克隆抗体WuT9/甘草次酸-氟尿嘧啶偶联顺铂/RGD肽修饰聚谷氨酸-顺铂复合物的制备

小编下面整理了单克隆抗体WuT9/甘草次酸-氟尿嘧啶偶联顺铂/RGD肽修饰聚谷氨酸-顺铂复合物的制备,来看! RGD肽修饰聚谷氨酸-顺铂复合物制备: 以改性聚谷氨酸侧链羧基与顺铂稳定配位,再与RGD肽进行化学偶联,得到修饰后的药物复合物,对复合物的…

【Java基础】HashMap扩容 | CopyOnWriteArrayList 的底层原理 | 字节码 | Java 异常体系

1. HashMap的扩容机制 JDK 1.7 扩容是针对数组进行扩容,链表是不需要进行扩容的。扩容时先生成原来数组两倍大小的新数组,在把原来老数组上的链表上的元素转移过去。具体在转移链表中元素的步骤是:取每个元素的 key,基于新数组长…

Java反射学习笔记--使用示例

简介 反射是Java编程语言中的一个特性。它允许执行的Java程序 检查 或 操作 自身,并操作程序的内部属性。例如,Java类可以获取其所有成员的名称并显示它们。 反射的一个具体用途是在JavaBeans中,软件组件可以通过一个构建工具进行可视化操作…

specCPU 2006 备忘

前言 首先 specCPU是收费的,好像是800还是1000$,缴费了才有软件分发给你,但是个人或者国内某些项目测试都是百度或者找整机,CPU或者操作系统厂家给。 specCPU和其他性能测试工具类似,基本上都是在被测试机器现场编译测试程序&am…

C++11主要新增使用语法介绍

目录 1. C11简介 2. 统一的列表初始化 2.1 {}初始化 2.2 std::initializer_list 3. 声明 3.1 auto 3.2 decltype 3.3 nullptr 4. STL中一些变化 5. 右值引用和移动构造/赋值 5. 1 左值引用和右值引用 5.2 右值引用使用场景和意义 5.3 完美转发…

map底层实现原理

目录一、map数据结构二、bucket数据结构三、哈希冲突四、负载因子五、渐进式扩容1.扩容的前提条件2.增量扩容3.等量扩容六、查找过程七、插入过程八、Map的value赋值九、Map的遍历赋值一、map数据结构 Golang的map使用哈希表作为底层实现,一个哈希表里可以有多个哈…

2022-11-20 C++并发编程( 四十四 ) -- 通讯顺序进程 CSP 范型

C并发编程 -- 四十四 前言一、通讯顺序进程 CSP 范型1. 细节分解1. lambda 封装类成员函数和 std::function< > 函数封装器2. 模板和 dynamic_cast< >类型转换二、ATM 示例总结前言 并发编程除了常规的使用锁, 或无锁结构实现某些并发计算, 还有没有其它实现形式?…

controller-informer

推翻了自己的三次理论&#xff0c;最终确定informer流程。自己梳理&#xff0c;有错请提示&#xff0c;以便及时改正 一、流程图 图1为整体流程&#xff0c;图2位细节流程 二、主要组件 Reflector-负责与API-Server进行绑定Delta FIFO-增量先进先出队列Indexer-本地缓存Resour…

Linux--系统基础磁盘管理相关知识详解笔记

1.磁盘知识体系结构 第一个层次&#xff1a;磁盘相关物理知识 内部结构 外部结构 读写数据原理 第二个层次&#xff1a;磁盘阵列知识 磁盘弹性扩展知识 ​ 阵列&#xff1a;将多块磁盘整合为一块 ​ &#xff08;1&#xff09;可以存储更大容量数据 ​ &#xff08;2&#…

[附源码]java毕业设计心理问题咨询预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

docker启动mysql实例之后,docker ps命令查询不到

1.首先拉取mysql,创建并启动实例 #docker pull mysql:5.7 # docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7…

Softing DTS.monaco 9.03新版发布,带有远程接口、并行诊断和动态VCI处理功能

2022年10月24日&#xff0c;Softing推出了“诊断工具集&#xff08;DTS&#xff09;”的新版本——Softing DTS.monaco 9.03。9.03版的诊断测试仪Softing DTS.monaco包含了很多新功能&#xff0c;将使您的工作变得更加简单。由于集成了一个新的连接插件&#xff08;动态VCI处理…

XCZU19EG_FFVC1760芯片的封装和管脚

首先写这篇文章是因为我有接触到这款芯片&#xff0c;但是在做接口约束时&#xff0c;有许多地方并不是很清楚&#xff0c;因此在这里对官方文档(ug1075)进行了通读&#xff0c;只翻译了我觉得我需要用到和需要了解的地方&#xff0c;具体是什么还需要大家去自己阅读官方文档。…

LeetCode 319 周赛

纪念本狗第三次AK&#xff01;&#xff01;&#xff01; 2469. 温度转换 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度&#xff0c;以 摄氏度&#xff08;Celsius&#xff09;为单位。 你需要将摄氏度转换为 开氏度&#xff08;Kelvin&#xff09;和 华氏度&a…

RK3568平台开发系列讲解(图像篇)JPEG图像处理

🚀返回专栏总目录 文章目录 一、JPEG文件格式和libjpeg编译二、libjpeg接口函数三、JPEG文件解析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我们今天来讲解JPEG图像处理。 一、JPEG文件格式和libjpeg编译 JPEG的后缀名为.jpg的图像文件。对于图像内容和信息相同…

Windows安装docker踩坑

安装过程中出现一下问题&#xff0c;步骤如下 菜鸟教程安装windows docker https://www.runoob.com/docker/windows-docker-install.html 启动后报错wsl2错误&#xff0c;因为本机运行的是wsl1&#xff0c;进行解决 wsl -l -v查看运行的虚-了拟机的版本以及状态 因为默认运…

一文带你学习,动态规划算法

一文带你学习&#xff0c;动态规划算法1.什么是动态规划&#xff08;DP&#xff09;2.青蛙跳台阶问题暴力递归解法自顶向下的递归解法自底向上的动态规划解法3.动态规划的解题套路穷举分析确定边界确定最优子结构写出状态转移方程4.经典线性DP&#xff1a;数字三角形5.01背包&a…