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

简介: 为什么会有装饰者模式假如有一个这样的场景,我们需要为某些对象(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();
    }
目录
相关文章
|
6月前
|
设计模式 Java
Java设计模式【十】:装饰者模式
Java设计模式【十】:装饰者模式
49 0
|
9天前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
|
23天前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
37 0
|
30天前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
26 0
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
22 0
|
5月前
|
设计模式 Java API
程序技术好文:设计模式:装饰者模式
程序技术好文:设计模式:装饰者模式
25 0
|
6月前
|
设计模式 Java
【设计模式系列笔记】装饰者模式
装饰者模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装类中来为原始对象添加新的行为。这种模式可以动态地将责任附加到对象上,而不影响其它对象。
70 11
|
6月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
|
设计模式
23种设计模式_MODE08装饰者模式_手写代码实现
23种设计模式_MODE08装饰者模式_手写代码实现
|
6月前
|
设计模式
【设计模式】装饰者模式
【设计模式】装饰者模式

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75