把书读薄 | 《设计模式之美》设计模式与范式(结构型-装饰器模式)(下)

简介: 本文对应设计模式与范式:结构型(50),装饰器模式 (Decorator Pattern)。装饰器模式和上节学的**桥接模式**(分离实体和行为) 代码结构非常相似,都是用组合来扩展原有类,但解决的问题大不相同。Tips:二手知识加工难免有所纰漏,感兴趣有时间的可自行查阅原文,谢谢。

四个角色:


  • Component (抽象组件) → 声明具体组件实现的业务方法,让客户端以一致的方式处理为修饰和修饰后的对象;


  • ConcreteComponent (具体组件) → 抽象组件的具体实现;


  • Decorator (抽象装饰类) → 包含对组件的引用,并重写抽象组件的方法;


  • ConcreteDecorator (具体装饰类) → 抽象装饰类的具体实现,除了重写方法外,还可以添加附加功能;


适用场景:


  • 在不影响其他对象的情况下,快速动态透明地为单个对象添加功能;


  • 不支持继承扩展类的场景,如final关键字修饰的类;


优点


快速扩展对象功能,比继承灵活,不会导致类个数急剧增加,动态增删对象实例功能,按需按顺序组合功能;


缺点


  • 顺序调用链装饰时,删除某个装饰器需要修改上下文代码;


  • 容易增加很多装饰对象,增加代理理解难度;


  • 和桥接模式一样,组合相比继承,更不容易找到对象间的调用关系;


附:装饰器模式应用示例 → Java IO类库


在网上找了张Java IO的继承树形图:


网络异常,图片无法展示
|


两个变化维度:字节流 or 字符流输入流 or 输出流,组合出四个子类:

InputStreamOutputStreamReaderWriter,针对不同的读写场景,从这四个父类的基础上,又扩充出很多子类。


在日常使用时,又涉及到了一个 低级流高级流 的概念,高级流不能直接使用,需要传入低级流,裹好几层,如:


InputStream in = new FileInputStream("/user/jie/test.txt");
InputStream bin = new BufferedInputStream(in);
DataInputStream din = new DataInputStream(bin);
int data = din.readInt();


原理就是采用了装饰器模式,低级流可以按需进行功能增强,如上面的支持缓存,支持按照基本类型读取数据。可以打开这三个类看看:


网络异常,图片无法展示
|


可以看到,都继承了InputStream类,中间两个类的构造函数传递的InputStream的实例:


网络异常,图片无法展示
|


看下DataInputStream.readInt()方法:


网络异常,图片无法展示
|


int是4个字节,所以这里读了4次,而代码中传入的in是BufferedInputStream的,会调它的read()方法:


网络异常,图片无法展示
|


fill()填充缓冲区,最后返回一个字节数组。


另外,不知道眼尖的你有没有发现,这两个类不是直接继承InputStream,而是继承自FilterInputStream,这样做的原因是:


有些装饰器本身不需要真正处理read()等方法,但是装饰器模式的 链式传递,不用到也要实现这些方法。而每个这样的装饰器都重写方法的话,会存在大量重复代码。用一个装饰器父类FilterInputStream提供默认实现,以此减少这些重复代码。


相关文章
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
147 0
|
11月前
|
设计模式 中间件 Java
设计模式3:代理、适配器、装饰器模式
代理模式是一种结构型设计模式,通过中间件解耦服务提供者和使用者,使使用者间接访问服务提供者,便于封装和控制。
210 3
|
设计模式 前端开发 JavaScript
前端必须掌握的设计模式——装饰器模式
装饰器模式是一种结构型设计模式,通过创建新类来包装原始对象,实现在不修改原有结构的前提下扩展新行为。其核心在于“组合”思想,使新功能可“即插即拔”。该模式具有解耦性、灵活性和动态性等特点,广泛应用于类的面向对象编程语言中,如JavaScript的注解和TypeScript的写法。示例中,通过装饰器模式为游戏角色动态添加装备,展示了其强大的扩展性和灵活性。
302 16
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
135 2
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
|
设计模式 程序员
结构型设计模式之适配器模式
结构型设计模式之适配器模式
|
设计模式
结构型设计模式之装饰模式
结构型设计模式之装饰模式
|
设计模式 编解码 网络安全
结构型设计模式之代理模式
结构型设计模式之代理模式
|
8月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
253 16
|
8月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
247 0