津津乐道设计模式 - 装饰者模式详解(以女友化妆场景带你彻底明白)

本文主要是介绍津津乐道设计模式 - 装饰者模式详解(以女友化妆场景带你彻底明白),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

津津乐道设计模式 - 装饰者模式详解

  • 什么是装饰者模式
  • 装饰者模式适用场景
  • 生活及代码案例
  • 装饰者模式优缺点
  • 结语

什么是装饰者模式

装饰者模式(Decorator Pattern)是一种结构设计模式,它允许你在不改变现有对象结构的情况下,动态地将新行为添加到对象中。

装饰者模式通过创建一个包装器类,该类包装了原始对象,并在保持接口不变的情况下,提供了额外的功能。这个包装器类被称为装饰者,它可以在被装饰对象执行之前或之后,执行一些额外的操作。

装饰者模式适用场景

在生活中装饰者模式的应用也比较多,比如给房子装修、给汽车改装等,都是在为对象扩展一些额外的功能,装饰者模式适用以下场景:

  • 动态地添加功能:装饰者模式适用于需要在运行时动态地为对象添加额外功能的场景。它允许你根据需要组合不同的装饰者,以实现各种不同的功能组合。
  • 避免使用子类的继承:装饰者模式提供了一种替代使用子类继承的方式来扩展对象功能的方法。通过装饰者模式,你可以通过组合装饰者来扩展对象的功能,而无需创建大量的子类。
  • 单一职责原则:装饰者模式允许你将对象的功能划分为多个单一职责的类,每个类都专注于特定的功能,符合单一职责原则。

装饰者模式适用于需要动态地添加功能、避免使用大量子类继承和遵循单一职责原则的场景。它可以提供一种灵活的方式来扩展对象的功能,同时保持代码的可维护性和可扩展性。

生活及代码案例

之前我们在讲解 模版模式详解 的时候,我们那女朋友化妆的流程来演示,同样本次装饰者模式也同样可以以女朋友化妆的场景来讲解。

假设你的女朋友正在准备参加一场重要的约会 😳,她希望能够化一个美丽而独特的妆容。现在我们使用装饰者模式来设计化妆的过程。

首先,我们有一个基本的化妆类,表示女朋友的原始妆容:

//定义接口
public interface Makeup {void apply();
}
//定义女朋友的原始妆容
public class BasicMakeup implements Makeup {@Overridepublic void apply() {System.out.println("女朋友的原始妆容");}
}

然后,我们定义一个装饰者抽象类,表示不同的化妆步骤的装饰者:

//定义一个装饰者抽象类
public abstract class MakeupDecorator implements Makeup {protected Makeup makeup;public MakeupDecorator(Makeup makeup) {this.makeup = makeup;}@Overridepublic void apply() {makeup.apply();}
}

接下来,我们可以定义具体的化妆步骤装饰者类,如打底、眼妆和唇妆:

public class PrimerDecorator extends MakeupDecorator {public PrimerDecorator(Makeup makeup) {super(makeup);}@Overridepublic void apply() {super.apply();System.out.println("打底妆");}
}public class EyeMakeupDecorator extends MakeupDecorator {public EyeMakeupDecorator(Makeup makeup) {super(makeup);}@Overridepublic void apply() {super.apply();System.out.println("眼妆");}
}public class LipMakeupDecorator extends MakeupDecorator {public LipMakeupDecorator(Makeup makeup) {super(makeup);}@Overridepublic void apply() {super.apply();System.out.println("唇妆");}
}

现在,我们可以使用装饰者模式来组合不同的化妆步骤来完成女朋友的妆容,例如:

public class DecoratorPatternTest {public static void main(String[] args) {//女朋友初始妆容Makeup makeup = new BasicMakeup();//底妆装饰makeup = new PrimerDecorator(makeup);//眼妆装饰makeup = new EyeMakeupDecorator(makeup);//唇妆装饰makeup = new LipMakeupDecorator(makeup);makeup.apply();}
}

输出结果如下:
在这里插入图片描述
这样通过装饰者模式,我们可以动态地为女朋友的妆容添加不同的化妆步骤,实现个性化和多样化的妆容效果。

装饰者模式优缺点

装饰者模式的优点

  • 灵活性:装饰者模式允许你在不改变现有对象结构的情况下,动态地添加或修改对象的功能。你可以根据需要组合不同的装饰者,以实现各种功能组合,从而提供灵活的扩展性。

  • 单一职责原则:装饰者模式将功能划分到不同的类中,每个类都专注于特定的功能,符合单一职责原则。这使得每个类的代码更加清晰、简洁,并且易于理解和维护。

  • 开闭原则:装饰者模式支持开闭原则,即对扩展开放,对修改关闭。你可以通过添加新的装饰者类来扩展对象的功能,而无需修改现有的代码。这使得系统更加稳定,易于扩展和维护。

  • 组合多个装饰者:装饰者模式可以同时应用多个装饰者,通过组合不同的装饰者,你可以实现更复杂的功能组合,满足不同的需求。

装饰者模式的缺点

  • 复杂性增加:引入装饰者类和装饰者之间的关联关系,会增加系统的复杂性。需要理解每个装饰者的作用和调用顺序,以确保装饰者的正确组合和执行顺序。

  • 可能产生大量的类:如果需要大量的装饰者来实现各种功能组合,可能会导致类的数量增加,使得代码结构复杂化。因此,需要权衡装饰者的使用,避免过度装饰。

  • 动态装饰的限制:装饰者模式通常是通过组合来实现功能的动态添加,但在某些情况下,如果需要在运行时动态地移除装饰者或更改装饰者的顺序,会比较困难。

总的来说,装饰者模式在提供灵活性和扩展性方面有很大优势,但在设计时需要权衡复杂性和类的数量,确保合理使用装饰者模式,并根据具体需求进行权衡。

结语

本章节主要讲解的是装饰者模式应用场景、装饰者模式优缺点,并以女朋友化妆场景,使用装饰者模式动态地为女朋友的妆容添加不同的化妆步骤的形式,书写JAVA代码进行演示,加深大家的印象。如果本文对你有用,欢迎关注收藏评论,大家一起探讨~

样例代码:https://github.com/lhmyy521125/toher-designmode

这篇关于津津乐道设计模式 - 装饰者模式详解(以女友化妆场景带你彻底明白)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/324355

相关文章

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串