设计模式(结构型设计模式——装饰者模式)

设计模式(结构型设计模式——装饰者模式)

装饰者模式

基本定义

装饰模式指的是在不必改变原类文件和使用继承(也是与适配器模式不一样的地方)的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

模式结构

Component: 抽象构件。是定义一个对象接口,可以给这些对象动态地添加职责。

ConcreteComponent:具体构件。是定义了一个具体的对象,也可以给这个对象添加一些职责。

Decorator:抽象装饰类。是装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的。

ConcreteDecorator:具体装饰类,起到给Component添加职责的功能。

代码实现

Component:抽象构件, 被装饰抽象类
public interface Cake {String nameDetail();Double price();
}
ConcreteComponent: 抽象实现类,被装饰对象类
public class CakeImpl implements Cake {/*** 手抓饼配料->鸡蛋,牛肉,蔬菜,* 组合方式:1.鸡蛋,2.牛肉,3.蔬菜,4. 鸡蛋+牛肉,5. 鸡蛋+蔬菜,6.牛肉+蔬菜, 7.鸡蛋+牛肉+蔬菜*/public String nameDetail() {return "原味手抓饼";}public Double price() {return 5d;}
}
Decorator: 抽象装饰类
public class CakeDecorator implements Cake{Cake cake;//装饰实现类public CakeDecorator(Cake cake) {this.cake = cake;}public String nameDetail() {return cake.nameDetail();}public Double price() {return cake.price();}
}
ConcreteDecorator: Decorator具体实现类

鸡蛋手抓饼 +1.5元

public class EggCakeDecorator extends CakeDecorator{public EggCakeDecorator(Cake cake) {super(cake);}//关键部分@Overridepublic String nameDetail() {return "鸡蛋," + cake.nameDetail();}@Overridepublic Double price() {return 1.5 + cake.price();}
}

牛肉手抓饼 +2元

public class MeetCakeDecorator extends CakeDecorator{public MeetCakeDecorator(Cake cake) {super(cake);}//关键部分@Overridepublic String nameDetail() {return "牛肉," + cake.nameDetail();}@Overridepublic Double price() {return 2 + cake.price();}
}

蔬菜手抓饼 +0.5元

public class VeggCakeDecorator extends CakeDecorator{public VeggCakeDecorator(Cake cake) {super(cake);}//关键部分@Overridepublic String nameDetail() {return "蔬菜," + cake.nameDetail();}@Overridepublic Double price() {return 0.5 + cake.price();}
}
测试类
@Slf4j
public class Test {public static void main(String[] args) {Cake cake = new CakeImpl();log.info("小红想吃{}, 价格:¥{}", cake.nameDetail(), cake.price());CakeDecorator cakeEgg = new EggCakeDecorator(cake);log.info("小明想吃{}, 价格:¥{}", cakeEgg.nameDetail(), cakeEgg.price());CakeDecorator meetCake = new MeetCakeDecorator(cakeEgg);CakeDecorator veggCake = new VeggCakeDecorator(meetCake);log.info("小张想吃{}, 价格:¥{}", veggCake.nameDetail(), veggCake.price());}
}

优点

  1. 装饰者模式可以提供比继承更多的灵活性。

  2. 可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。

  3. 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。

  4. 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。

缺点

  1. 会产生很多的小对象,增加了系统的复杂性

  2. 这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

使用场景

  1. 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  2. 需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。

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

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

相关文章

[Halcon学习笔记]标定常用的Halcon标定板规格及说明

1、介绍 大多数标定的要求都是以实心圆或方格来作为标志点,所以一般的标定板为棋盘格或矩阵圆点图,高精度的相机标定过程中,大多是以比较明确的特征点来作为参考,所以通过识别标定板的圆形,拟合出精确的中心位置&…

3.19总结

A计划 题解&#xff1a;这题其实就是一个很简单的三维搜索&#xff0c;有了一个传送门&#xff0c;并且要确定是否传过去的对应位置是墙&#xff0c;防止被装死&#xff0c;同事呢又要在对应的t时间内完成&#xff08;不一定要卡着t时间恰好完成&#xff09; #include<ios…

linux单机部署hadoop

1.下载安装包 https://archive.apache.org/dist/hadoop/common/ 2.上传压缩 3.修改配置文件 1)设置JDK的路径 cd /usr/local/software/hadoop-3.1.3/etc/hadoop vi hadoop-env.sh export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/ 查看…

Windows下的TCP/IP实例

1.注意事项 windows下winsock.h/winsock2.h linux下sys/socket.h 不同平台头文件不一样 #include <winsock.h> 或者 #include <winsock2.h> 2. 安装minGW 目标是在 Windows 环境下提供类似于 Unix/Linux 环境下的开发工具&#xff0c;使开发者能够轻松地在 Wind…

1Panel应用推荐:Nginx Proxy Manager

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

springBoot---过滤器,监听器,拦截器

过滤器&#xff0c;监听器&#xff0c;拦截器 一、理解它们 看里十几篇博客&#xff0c;总算有点小明白&#xff0c;总的来讲&#xff0c;两张图可以让我看明白点。 通过两幅图我们可以理解拦截器和过滤器的特点 1、过滤器 过滤器是在请求进入tomcat容器后&#xff0c;但请求…

2024流星全自动网页生成系统重构版源码

2024流星全自动网页生成系统重构版源码 源码介绍 流星全自动网页生成系统重构版源码分享&#xff0c;所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 为用户使…

【第十五章】改进神经网络学习方式-手写数字识别重新编码实现

让我们来实现我们在之前讨论过的想法。我们将开发一个新的程序&#xff0c;network2.py&#xff0c;这是我们之前开发的程序 network.py 的改进版本。如果你有一段时间没有看过 network.py&#xff0c;那么花几分钟快速阅读之前的讨论可能会有所帮助。它只有 74 行代码&#xf…

差分【Java】

https://blog.csdn.net/weixin_45629285/article/details/111146240?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171084120016800225530603%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id171084120016800225530603&biz_i…

44.for语句

目录 一.什么是for语句 二.语法格式 三.举例 四.视频教程 一.什么是for语句 C语言中除了while和do while循环语句&#xff0c;还有for循环语句&#xff0c;所以for语句也是循环语句。 二.语法格式 for&#xff08;表达式1&#xff1b;表达式2&#xff1b;表达式3&#xf…

8.python中的元组

8.python中的元组 虽然说元组用的不是很多&#xff0c;但是还是讲一下。元组其实可以看为是一个列表&#xff0c;不可变的列表。操作和列表都差不多。 元组&#xff08;tuple&#xff09;是Python中的一种基本数据结构类型&#xff0c;它是不可变的序列&#xff0c;意味着一旦…

耐寒输送带是什么

耐寒输送带&#xff1a;定义、特性及应用 耐寒输送带是一种特殊设计的输送带&#xff0c;能够在低温环境下保持其性能稳定&#xff0c;实现持续、高效的物料输送。随着工业技术的不断发展和应用领域的拓宽&#xff0c;耐寒输送带的需求也在不断增长。本文将深入探讨耐寒输送带…

张宇高数一学习笔记-第一讲-函数极限与连续(1)

1、函数的概念与特性 1.1、函数 1、y才是x的函数&#xff0c;而f()是加工法则。 2、定义域是基于加工法则f()存在的&#xff0c;也就是说加工法则f()对()内数据的限制范围就是定义域。而 3、自变量x的取值范围来源于&#xff1a;定义域对()内的含x表达式的限制下得出的x的取值…

【爬虫】实战-爬取Boss直聘信息数据

专栏文章索引&#xff1a;爬虫 所用工具&#xff1a; 自动化工具&#xff1a;DrissionPage 目录 一、找到目标数据(2个确定)​ 1.确定目标网页 2.确定目标网址 二、编写代码​ 三、查看数据​ 五、总结 一、找到目标数据(2个确定) 1.确定目标网页 打开目标网站 网站&am…

DolphinScheduler运维-页面加载缓慢

一、问题描述 DolphinScheduler调度平台的UI界面加载缓慢,项目中的任务实例加载时间过长,需要解决这个问题,提高DolphinScheduler平台UI页面的加载速度。 二、原因分析 经过分析发现,任务实例过多是导致UI加载缓慢的主要原因。由于任务实例无法直接删除,根据文档了解到需…

狼人杀 魔镜少女 个人玩法理解

最近出来的新板子 (魔镜少女 觉醒隐狼) 确实是非常的好玩 先来说说板子身份 好人阵营: 神职牌有 魔镜少女 女巫 猎人 守卫 民牌有: 四个普通平民 狼人阵营: 觉醒隐狼 四个普通小狼人 先来说说技能 魔镜少女每晚可以翻拍查验一名玩家的具体身份&#xff0c;注意 是具体身份 就…

网络架构层_交换机连接使用

网络架构层_交换机连接使用 交换机是不是不会用呀&#xff1f;交换机&#xff0c;服务器&#xff0c;路由器&#xff0c;防火墙&#xff0c;网关&#xff0c;这些都是嘛呀&#xff1f; 网上的一些网络架构图&#xff0c;具体项目按照实际考虑。 交换机的Console口——通过Con…

c语言指针(二)

c语言指针&#xff08;二&#xff09; 1.数组名的理解 2.使用指针访问数组 3.一维数组的传参本质 1.数组名的理解 int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; int* p &arr[0]这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是…

使用OpenRewrite自动做框架升级比如Spring Boot

简介 OpenRewrite 用于大规模自动化源代码重构 OpenRewrite 是一个源代码自动重构生态系统&#xff0c;使开发人员能够有效消除其存储库中的技术债务。 它由一个自动重构引擎组成&#xff0c;该引擎运行预先打包的开源重构方案&#xff0c;用于常见框架迁移、安全修复和风格…

【链表】Leetcode 142. 环形链表 II【中等】

环形链表 II 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系…