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

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

在这里插入图片描述

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人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

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓