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.hqwc.cn/news/267007.html

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

相关文章

【S32DS RTD实战】-1.3-S32K3工程生成S19,BIN,Hex文件,以及Post-build steps的妙用

目录 1 方法一:逐个生成Motorola S-record(s19,srec…),Intel HEX,Bin文件 1.1 生成Motorola S-record(s19,srec…)文件 1.2 生成Intel HEX文件 1.3 生成Bin文件 2 …

中文语音标注工具FunASR(语音识别)

全称 A Fundamental End-to-End Speech Recognition Toolkit(一个语音识别工具) 可能大家用过whisper(openAi),它【标注英语的确很完美】,【但中文会出现标注错误】或搞了个没说的词替换上去,所…

电子学会C/C++编程等级考试2022年06月(五级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:逃离迷宫 你在一个地下迷宫中找到了宝藏,但是也触发了迷宫机关,导致迷宫将在T分钟后坍塌,为此你需要在T分钟内逃离迷宫,你想知道你能不能逃离迷宫。迷宫是一个边长为m的正方形,其中"S"表示你所在的位置,"…

大语言模型有什么意义?亚马逊训练自己的大语言模型有什么用?

近年来,大语言模型的崭露头角引起了广泛的关注,成为科技领域的一项重要突破。而在这个领域的巅峰之上,亚马逊云科技一直致力于推动人工智能的发展。那么,作为一家全球科技巨头,亚马逊为何会如此注重大语言模型的研发与…

深度学习 Day13——P2彩色图片分类

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU(如果设备上支持GPU就使用GPU,否则使用C…

论文阅读《High-frequency Stereo Matching Network》

论文地址:https://openaccess.thecvf.com/content/CVPR2023/papers/Zhao_High-Frequency_Stereo_Matching_Network_CVPR_2023_paper.pdf 源码地址: https://github.com/David-Zhao-1997/High-frequency-Stereo-Matching-Network 概述 在立体匹配研究领域…

Unity之OpenXR+XR Interaction Toolkit接入微软VR设备Windows Mixed Reality

前言 Windows Mixed Reality 是 Microsoft 用于增强和虚拟现实体验的VR设备,如下图所示: 在国内,它的使用率很低,一把都是国外使用,所以适配起来是相当费劲。 这台VR设备只能用于串流Windows,启动后,会自动连接Window的Mixed Reality程序,然后打开微软的增强现实门户…

前端框架(Front-end Framework)和库(Library)的区别

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

树莓派,opencv,Picamera2利用舵机云台追踪人脸

一、需要准备的硬件 Raspiberry 4b两个SG90 180度舵机(注意舵机的角度,最好是180度且带限位的,切勿选360度舵机)二自由度舵机云台(如下图)Raspiberry CSI 摄像头 组装后的效果: 二、项目目标…

VBA信息获取与处理:在EXCEL中随机函数的利用

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

点评项目——秒杀优化

2023.12.11 上一张的秒杀券下单还可以进行优化,先来回顾一下下单流程: 可以看出流程设计多次查询和操作数据库的操作,并且执行顺序是一个线程串行执行,执行性能是比较低的。 优化方案:我们将判断秒杀库存和校验一人一单…

剑指 Offer(第2版)面试题 23:链表中环的入口结点

剑指 Offer(第2版)面试题 23:链表中环的入口结点 剑指 Offer(第2版)面试题 23:链表中环的入口结点解法1:快慢指针 剑指 Offer(第2版)面试题 23:链表中环的入口…