本文主要是介绍津津乐道设计模式 - 装饰者模式详解(以女友化妆场景带你彻底明白),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人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
这篇关于津津乐道设计模式 - 装饰者模式详解(以女友化妆场景带你彻底明白)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!