装饰器(Decorator)模式:指不改变现有对象结构的情况下,动态地给该对象增加额外功能。

一、装饰器模式介绍

装饰器模式允许向一个现有的对象添加新的功能,同时不改变其结果。比如Java 中的IO框架中,FileInputStream(处理文件)、ByteArrayInputStream(处理字节数组)、BufferedInputStream(带缓存的处理类)等就是对InputStream进行的功能扩展,这就是装饰器模式的典型应用。比如下面就是以缓存方式读取输入流:

InputStream inputStream = new BufferedInputStream(new FileInputStream("test.txt"));
byte[] data = new byte[128];
while(inputStream.read(data) != -1){//...
}

1.1 装饰器模式结构

装饰器主要使用组合关系来创建一个装饰对象,用于包裹真实对象,并在保持真实对象的类结构不变的前提下为其提供额外的功能。具体的基本结构如下所示:

  • Component:抽象构件,定义一个抽象接口以规范准备接收附加责任的对象
  • ComponentA:具体构件,实现抽象构件,通过装饰角色为其添加一些职责
  • Decorator:抽象装饰构件,并包含具体构件的实例
  • DecoratorA、DecoratorB:实现抽象装饰构件的具体装饰构件,包含实现抽象装饰的相关方法
  • Client:客户端

1.2 装饰器模式实现

根据上面的类图可以实现如下代码:

/*** @description: 抽象构件角色* @author: wjw* @date: 2022/3/31*/
public interface Component {public void operation();
}/*** @description:具体构件角色* @author: wjw* @date: 2022/3/31*/
public class ComponentA implements Component{public ComponentA() {System.out.println("创建具体构件componentA");}@Overridepublic void operation() {System.out.println("我是具体构件A的operation方法");}
}/*** @description: 抽象装饰* @author: wjw* @date: 2022/3/31*/
public class Decorator implements Component{private Component component;public Decorator(Component component) {this.component = component;}@Overridepublic void operation() {component.operation();}
}/*** @description: 具体装饰角色A* @author: wjw* @date: 2022/3/31*/
public class DecoratorA extends Decorator{public DecoratorA(Component component) {super(component);}@Overridepublic void operation() {super.operation();addedFunction();}/*** 增加的额外功能*/public void addedFunction() {System.out.println("我是为具体装饰角色A增加额外功能方法addedFunction");}
}/*** @description: 具体装饰角色B* @author: wjw* @date: 2022/3/31*/
public class DecoratorB extends Decorator{public DecoratorB(Component component) {super(component);}@Overridepublic void operation() {super.operation();addedFunction();}private void addedFunction() {System.out.println("为具体装饰角色增加额外的功能B");}
}/*** @description: 客户端* @author: wjw* @date: 2022/3/31*/
public class DecoratiorClient {public static void main(String[] args) {Component componentA = new ComponentA();componentA.operation();Decorator decoratorA = new DecoratorA(componentA);decoratorA.operation();}
}

二、装饰器模式应用场景

2.1 Java IO 类中的应用

在开始介绍中提到,IO中有很多装饰器的应用:

如上图所示,比如InputStream后面的若干装饰器类都是对其的功能扩展。

2.2 MyBatis 中 Cache的应用

Cache 中除了有数据存储和缓存的基本功能外还有其他附加的 Cache 类,比如有 FifoCache(先进先出)、LruCache(最近最少使用LRU)、SychronizedCache(防止多线程并发访问)的众多附加功能的缓存类。都是装饰器的应用:

参考资料

https://mp.weixin.qq.com/s/hDJs6iG_YPww7yeiPxmZLw?

http://c.biancheng.net/view/1366.html

这篇文章告诉你装饰器模式及其在Java IO类和MyBatis中的应用相关推荐

  1. 装饰器模式代码举例(java语言版)

    前言:为了解决子类膨胀问题,把被装饰的以关联的方式放入装饰类里面,装饰类添加新的功能,如果需要再扩展新功能的时候,那么可以考虑直接继承装饰类.下面是一个画圆的例子(其实ServletRequest.H ...

  2. Java设计模式之结构型:装饰器模式

    一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...

  3. 设计模式-装饰器模式 C++

    一.简介 1.什么是装饰器模式 装饰器模式是结构型设计模式. 装饰器是现有类的一个包装,可以在不修改现有类且不增加子类的情况下扩展现有类. [注]可以实现向一个现有对象添加新的功能,同时又不改变其结构 ...

  4. 从未这么明白的设计模式(三):装饰器模式

    本文原创地址:jsbintask的博客(食用效果最佳),转载请注明出处! 同系列文章: 从未这么明白的设计模式(二):观察者模式 从未这么明白的设计模式(一):单例模式 前言 装饰器模式是为了运行时动 ...

  5. Mybatis源码:Cache 装饰器模式

    装饰器模式介绍 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个 ...

  6. 装饰器模式(讲解+应用)

    转载自 设计模式(5)装饰器模式(讲解+应用) 目录 装饰器模式 为什么使用装饰器模式 应用实例 装饰器模式 看到装饰器是在看<Thinking in Java>一书的时候,看到文件读写那 ...

  7. JAVA设计模式-装饰器模式(Decorator)

    装饰器模式(Decorator) 为了某个实现类在不修改原始类的基础上进行动态地覆盖或者增加方法 采用--------装饰器模式 实现类要保持与原有类的层级关系 装饰器模式是一种特殊的适配器模式 拿适 ...

  8. 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现

    课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...

  9. golang设计模式——装饰器模式

    装饰器模式 装饰器模式: 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. UML类图: 分析 首先我们需要理解,为什么组合优于继承? 继承有诸多作用,但继承层次过深. ...

最新文章

  1. 物联网时代传感器厂商竞争格局揭秘
  2. 又搜集一批项目源码,同样改改就能用
  3. 终于来热风了,又一次感觉到什么叫温暖!
  4. 线性稀疏自编码机_特征工程之特征缩放amp;特征编码
  5. 利用TinyXML读取VOC2012数据集的XML标注文件裁剪出所有人体目标保存为文件
  6. java的几种对象(PO,VO,DAO,BO,POJO)解释
  7. netflow流量分析工具 linux,Centos5/Linux安装Nfdump和Nfsen图形界面分析netflow数据
  8. 当前不会命中断点_原神:体验服新角色胡桃,0命就能起飞,难道是策划良心发现了?...
  9. 燃气管理 php,智能燃气管理信息系统设计
  10. 【追一科技】NLG技术:文本生成技术多样化应用的探索之路
  11. python 利用栈实现复杂计算器
  12. atitti 提升稳定性的艺术之程序代码级别稳定性的艺术 attialx著 艾提拉著 s420.docx 1. 前言 1 2. 为什么会发生稳定性问题 1 2.1. 单点故障(单点故障率较高) 1
  13. 【Unity3D】计算二维向量夹角(-180到180)
  14. linux设计引物探针,如何设计荧光定量PCR的引物及TaqMan探针
  15. 牛客网暑期ACM多校训练营(第五场)B. div(技巧+OEIS or Pell方程)
  16. 软考数据库-无损联接分解
  17. pe和linux一起安装到移动硬盘,PE安装在移动硬盘的详细教程
  18. 做人不能太“广州有线”了
  19. 高校供需撮合交易平台规范管理及创新发展
  20. Vue开发入门(二) | 说说Vue全家桶有哪些~

热门文章

  1. Ubuntu 17.10 (Artful Aardvark) 目标使用Linux 4.13内核系列
  2. 破解VMware Workstation单个虚拟机最多只允许有8个虚拟CPU的限制。
  3. JAVAWEB实现在线预览PDF
  4. UWB芯片DW3000之MAC层(四)CCA空闲信道评估机制
  5. Mac上 Word安装Mendeley插件
  6. uni-app导航栏
  7. iOS中的UINavigationController
  8. 可视猫眼门铃雷达方案,人体存在感应雷达模组,智能亮屏响铃
  9. 工业相机、镜头接口:C口与CS口
  10. 新浪微博 ID与MID互转 (62进制)