设计模式之装饰者模式

为什么要使用装饰者模式?

在一个类中需要添加一些非核心的功能,并且这些非核心功能只是为了满足特定情况下的特定行为时,就可以使用装饰者模式将这非核心功能区分开来,降低类的复杂度。使用继承也可以做到以上的区分,但是继承又有什么缺点呢?

InputStream的部分UMl图

在这里插入图片描述
在输入字节流中,有五大基本流这里只列出了文件和字节数组,如果需要对这两个流增加缓存,转换和回写的功能,通过继承的方式单单实习一个功能就需要增加六个类,如果加上组合的功能,产生的子类数量就会爆炸式增长。装饰者模式就很好的解决了这个问题。BufferedInputStream通过构造方法传入一个FileInputStream,如果还需要转换字节为java对象,这时将BufferedInputStream再传入DataInputStream中。

BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(""));
DataInputStream dataInputStream  = new DataInputStream(bufferedInputStream);

我们常用的I/O流中就是典型的装饰者模式,像BufferedInputStream就是 FileInputStream一个装饰,数据的数据才是I/O的核心功能,BufferedInputStream添加了缓冲的能力。

从字节流看每一个类的角色
  • InputStream:字节输入流,抽象类
  • FileInputStream:文件输入流,实现了InputStream,核心功能读取文件。被装饰类
  • DataInputStream,BufferedInputStream,PushBackInputstream:具有装饰功能的三个类,继承于FilterInputStream.
  • FilterInputStream:拥有装饰类 derocator所有功能的父类

装饰者模式的核心是装饰者在构造中持有和被装饰者所实现的同一个接口的对象引用,注意装饰者是有顺序的,取决于装饰过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值