23种设计模式之装饰者模式(被装饰者,接口层,装饰抽象层,具体装饰者)

23种设计模式之装饰者模式

文章目录

  • 23种设计模式之装饰者模式
    • 设计思想
    • 装饰者模式的优点
    • 装饰者模式的缺点
    • 装饰者模式的优化方法
    • UML 解析
      • 预设场景
    • 代码释义
    • 总结

设计思想

原文:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。把一个形状装饰上不同的颜色同时又不改变形状类

简述:看到原文介绍,很多人会认为装饰者模式与代理模式没区别,其实区别还是有的,只是在用的时候可能会存在异变代理模式,装饰者模式其根本是为了 增强被装饰者的方法。

装饰者模式的优点

  • 可以在不修改原有对象的基础上给对象增加新的功能,遵循开闭原则。
  • 可以使用多个具体装饰者来组合出不同的功能,实现灵活性和可扩展性。
  • 可以根据需要动态地增加或删除功能,而不影响其他对象。
  • 可以保持被装饰对象的类型和接口不变,对客户端透明。

装饰者模式的缺点

-会增加系统的复杂度和类的数量,可能导致代码难以理解和维护。

  • 会增加对象之间的耦合度,可能引入循环引用的问题。
  • 会影响被装饰对象的效率和性能。
  • 动态地多层装饰时,调试和维护比较困难

装饰者模式的优化方法

  • 尽量减少装饰者的数量和层次,避免过度使用装饰者模式
  • 使用工厂方法或者建造者模式来创建装饰者对象,简化客户端的调用
  • 使用组合/聚合代替继承,降低装饰者和被装饰者之间的耦合度

UML 解析

在这里插入图片描述

预设场景

RanchStaff 牧场工作人员
CowRanch 奶牛牧场
MilkProcessing 牛奶加工
RanchAiRobot 牧场人工智能机器人

牧场工作人员可以挤奶 生产牛奶 但是我想在生产牛奶前进行消毒处理以及牛奶生产后进行包装

代码释义

/*** 奶牛牧场*/
public interface CowRanch {void milkProduction();
}
public class MilkProcessing extends RanchAiRobot {public MilkProcessing(CowRanch cowRanch) {super(cowRanch);}public void disinfect() {System.out.println("先进行消毒 处理");}@Overridepublic void milkProduction() {disinfect();super.milkProduction();packageMilk();}public void packageMilk() {System.out.println("将生产出的牛奶进行包装");}
}
/*** 牧场人工智能 机器人*/
public abstract class RanchAiRobot implements CowRanch {private CowRanch cowRanch;public RanchAiRobot() {}public RanchAiRobot(CowRanch cowRanch) {this.cowRanch = cowRanch;}public void milkProduction() {cowRanch.milkProduction();}
}
/*** 牧场工作人员*/
public class RanchStaff implements CowRanch {public void milkProduction() {System.out.println("将奶牛的奶挤出,制成牛奶");}
}

总结

装饰者模式 其核心就是为了增强方法,对原业务的扩展,以上面的场景来说,牧场工作人员只做牛奶的生产,但是想要对牛奶进行销售,只生产是不够的,生产前后都需要增加其他的行为。
装饰抽象层存在的意义 抽象类实现接口,可以选择性的去实现接口的抽象方法,并不需要重写接口所有方法,装饰抽象层可以精确的让具体装饰者去装饰某一个行为。

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

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

相关文章

应用在LED灯光控制触摸屏中的触摸芯片

LED灯光控制触摸屏方法,包括:建立触摸屏的触摸轨迹信息与LED灯光驱动程序的映射关系;检测用户施加在触摸屏上的触摸轨迹,生成触摸轨迹信息;根据生成的触摸轨迹信息,调用对应的LED灯光驱动程序,控…

HJ14 字符串排序

一、题目 描述 给定 n 个字符串,请对 n 个字符串按照字典序排列。数据范围: 1 \le n \le 1000 \1≤n≤1000 ,字符串长度满足 1 \le len \le 100 \1≤len≤100 输入描述: 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符…

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

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

说说React中的虚拟dom?在虚拟dom计算的时候diff和key之间有什么关系?

虚拟 DOM(Virtual DOM)是 React 中的一种机制,通过在内存中构建一棵轻量级的虚拟 DOM 树来代替操作浏览器 DOM,从而提高组件的渲染性能和用户体验。 在 React 中,当组件的 Props 或 State 发生变化时,Reac…

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

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

酷开科技多维度赋能营销,实力斩获三项大奖

在数智化新阶段、广告新生态、传播新业态的背景下,“第30届中国国际广告节广告主盛典暨网易传媒态度营销峰会”于11月18日在厦门国际会展中心盛大举行。来自全国的品牌方、战略决策者、媒体平台和品牌服务机构等汇聚一堂。在50000+现场观众和数千万线上观…

openssl的x509命令工具

X509命令是一个多用途的证书工具。它可以显示证书信息、转换证书格式、签名证书请求以及改变证书的信任设置等。 用法: openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET] [-keyform DER|PEM] [-CAform DER|PEM] [-CAkeyform DER|PEM] [-in filename…

vue elementui点击按钮新增输入框(点多少次就新增多少个输入框,无限新增)

效果如图&#xff1a; 核心代码&#xff1a; <div v-for"(item,index) in arrayData" :key"item.id">//上面这个是关键代码&#xff0c;所有思路靠这个打通<el-inputtype"input" //除了输入框&#xff0c;还有textarea等placeholder&…

SequentialChain

以下是使用SequentialChain创建Java代码的单元测试代码的示例&#xff1a; import sequentialchain.SequentialChain; import static org.junit.Assert.assertEquals; import org.junit.Test;public class SequentialChainTest {Testpublic void testAdd() {SequentialChain&l…

k8s详细教程(一)

—————————————————————————————————————————————— 博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码…

《Spring Cloud Alibaba 从入门到实战》分布式消息(事件)驱动

分布式消息&#xff08;事件&#xff09;驱动 1、简介 事件驱动架构(Event-driven 架构&#xff0c;简称 EDA)是软件设计领域内的一套程序设计模型。 这套模型的意义是所有的操作通过事件的发送/接收来完成。 传统软件设计 举个例子&#xff0c;比如一个订单的创建在传统软…

「差生文具多系列」推荐两个好看的 Redis 客户端

&#x1f4e2; 声明&#xff1a; &#x1f344; 大家好&#xff0c;我是风筝 &#x1f30d; 作者主页&#xff1a;【古时的风筝CSDN主页】。 ⚠️ 本文目的为个人学习记录及知识分享。如果有什么不正确、不严谨的地方请及时指正&#xff0c;不胜感激。 直达博主&#xff1a;「…

ModuleNotFoundError: No module named ‘huggingface_hub.snapshot_download‘

ModuleNotFoundError: No module named ‘huggingface_hub.snapshot_download’ 的解决方法 根据提示显示XXX模块不存在&#xff0c;一般会直接安装XXX模块&#xff0c;但是这个不需要显式安装huggingface-hub。 只需要升级sentence-transformers即可。 pip install -U sente…

Innosetup 安装包 在安装前判断是否有其他安装程序正在安装...

方法有&#xff1a; 1.使用系统服务WinMgmts 系统信息通过 "winmgmts:\\.\root\CIMV2" 遍历进程列表。 var FSWbemLocator: Variant; FWMIService : Variant; FWbemObjectSet: Variant; begin Result : false; FSWbemLocator : CreateOleObject(WBEMScripti…

Fabric使用自己的链码进行测试-go语言

书接前文 Fabric链码部署-go语言 通过上面这篇文章&#xff0c;你可以部署好自己的链码 &#xff08;后面很多命令是否需要修改&#xff0c;都是根据上面这篇文章来的&#xff0c;如果零基础的话建议先看上面这篇&#xff09; 就进行下一步 在测试网络上运行自己的链码 目…

PDF文件的限制编辑,如何设置?

想要给PDF文件设置一个密码防止他人对文件进行编辑&#xff0c;那么我们可以对PDF文件设置限制编辑&#xff0c;设置方法很简单&#xff0c;我们在PDF编辑器中点击文件 – 属性 – 安全&#xff0c;在权限下拉框中选中【密码保护】 然后在密码保护界面中&#xff0c;我们勾选【…

系列十、SpringBoot + MyBatis + Redis实现分布式缓存(基于注解方式)

一、概述 上篇文章 系列九、SpringBoot MyBatis Redis实现分布式缓存 介绍了基于xml方式实现分布式缓存的效果&#xff0c;当前大家使用的技术栈基本是springboot各种框架的组合&#xff0c;而springboot显著的一个特点就是去xml配置&#xff0c;那么在无xml配置的情形下&…

CStdioFile

CStdioFile 文件创建、数据写入、写入路径 void StdReferenceDWG::RefDrawCrvt(StdOneReference& ref) {char* old_locale _strdup(setlocale(LC_CTYPE, NULL));setlocale(LC_CTYPE, "chs");//设定CString strPath StdTool::GetCurPath() _T("衬图\\Re…

界面控件DevExpress中文教程 - 如何用Office File API组件填充PDF表单

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库&#xff0c;不用安装Microsoft Office&#xff0c;就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

基于SpringBoot的就业信息管理系统设计与实现(源码+数据库+文档)

摘 要 在新冠肺炎疫情的影响下&#xff0c;大学生的就业问题已经变成了一个引起人们普遍重视的社会焦点问题。在这次疫情的冲击之下&#xff0c;大学生的就业市场的供求双方都受到了不同程度的影响&#xff0c;大学生的就业情况并不十分乐观。目前&#xff0c;各种招聘平台上…