每天一个设计模式之装饰者模式

简介: 为什么会有装饰者模式假如有一个这样的场景,我们需要为某些对象(A)动态的添加一些功能(method),那我们会怎么做?很直观的我们会想到继承,写一个类(B)继承于这个对象所属的类(A),然后重写他的方法。这似乎解决了问题,但是如果有一天,对象A多了一个功能或对原有的功能进行了修改,这个时候你会发现类B或多或少也要做出一些改变。这开始变得有些不方便,逐渐的人们发现继承这样的

为什么会有装饰者模式

假如有一个这样的场景,我们需要为某些对象(A)动态的添加一些功能(method),那我们会怎么做?很直观的我们会想到继承,写一个类(B)继承于这个对象所属的类(A),然后重写他的方法。这似乎解决了问题,但是如果有一天,对象A多了一个功能或对原有的功能进行了修改,这个时候你会发现类B或多或少也要做出一些改变。这开始变得有些不方便,逐渐的人们发现继承这样的紧密耦合的方式在代码复用方面并不理想。那么如何才能更好的复用代码使得对象的功能能够不断增加完善呢?接口是不错的选择,只要接口不发生变化,那么我们就可以通过某种设计对实现这个接口的类动态的添加某些功能,这种设计就是装饰者模式。

装饰者模式的特点和结构

通过上述描述,我们可以发现装饰者模式最大的特点就是装饰者和被装饰者都拥有相同的接口。装饰者可以在被装饰者方法的前后加上特定的前置处理和后置处理来增强被装饰者的功能。

装饰者模式实例

JAVA IO中的以OutputStream为核心的装饰者模式。如果我们向一个文件中写入数据可以用以下的代码

DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("文件路径")));
dataOutputStream.writeDouble(8.8);
dataOutputStream.flush();

这种通过嵌套的方式使得对象可以不断的聚合起来,最终称为一个功能强大IO类。装饰模式主要就是使用聚合。类图如下面所示,
io类图

那到底什么是聚合,一句话概括就是影魔和灵魂的关系,灵魂是影魔的一部分,但是没有灵魂了影魔还是可以玩的。那经常裹在一起的组合又是什么呢?在用一句话概括吧,蓝猫和蓝的关系,蓝猫需要蓝,没有蓝还玩个虚空。所以虽然组合和聚合都是整体和部分的关系,但是组合的关系更加紧密,更强一些。
最后附上一张图和两行代码从java的角度解释下聚合。
箭头解释图

//DataOutputStream的构造方法
public DataOutputStream(OutputStream out) {
        super(out);
    }

这里通过传参的方式使得OutputStream成为了DataOutputStream的一部分,但是DataOutputStream对象的生死却对OutputStream对象的生命周期产生什么影响,所以这是聚合,如果换成以下的方式,就是组合了,因为咱们生死与共啊。

public DataOutputStream() {
        out = new XXX();
    }
目录
相关文章
|
设计模式 Java
Java设计模式【十】:装饰者模式
Java设计模式【十】:装饰者模式
99 0
|
4月前
|
设计模式 缓存 安全
【设计模式】【结构型模式】装饰者模式(Decorator)
一、入门 什么是装饰者模式? 装饰者模式(Decorator Pattern)是 Java 中常用的结构型设计模式,它能在不修改原有对象结构的前提下,动态地为对象添加额外的职责。 为什么要装饰者模式?
82 8
|
6月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
8月前
|
设计模式 存储
「全网最细 + 实战源码案例」设计模式——装饰者模式
装饰者模式(Decorator Pattern)是一种结构型设计模式,通过“包装”现有对象来为其添加额外功能,而无需修改原有代码。它通过创建装饰类来扩展对象的功能,而非继承。该模式由抽象构件、具体构件、抽象装饰者和具体装饰者组成,允许在运行时动态组合功能。穿衣服的例子很好地解释了装饰者模式:你可以根据需要一层层添加衣物,如毛衣、夹克和雨衣,每件衣物都扩展了基本行为,但不是你的一部分,可以随时脱掉。 优点包括灵活性、避免子类爆炸和符合开闭原则;缺点是可能增加复杂性和难以理解。适用于希望在不修改代码的情况下为对象新增行为的场景,尤其当继承难以实现或不可行时。
135 15
|
9月前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
106 2
|
10月前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
|
10月前
|
设计模式 Java Kotlin
Kotlin - 改良设计模式 - 装饰者模式
Kotlin - 改良设计模式 - 装饰者模式
61 4
|
10月前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
|
11月前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
82 0
|
11月前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
99 0