(设计模式)装饰器

装饰器模式:在原有的功能附加额外的功能,从而扩展和强化已有的功能,同时也保留着原有功能的效果。

例如:JDK 的 IO 包里,就有很多装饰器的例子。如下 InputStream 的 UML 图:

file

InputStream 是所有输入流的顶级抽象基类,其中定义了最基本的 read 方法,负责读取数据,如下:

file

这里以 BufferedInputStream 为例,这个类除了提供读取的功能,还能将输入流缓存起来,减少数据传输的次数。从上面的 UML 可以知道 BufferedInputStream 是集成 FilterInputStream,那看看 FilterInputStream 是怎样:

file

下面是 BufferedInputStream 的构造方法:

file

从上面可以看出,BufferedInputStream 的构造方法会把 InputStream 类型引用传给父类 FilterInputStream 并赋值给属性 in,并且初始化缓冲区 buf 的大小,用于缓冲读取到的 IO 数据。

这里缓冲的附加效果体现在 read 方法里,如下图:

file

其中 fill 方法里面实现就是间接调用属性 in 的 read 方法来读取数据并填充到缓冲区。

file

模式分析:

1、使用组合方式,在不改变原有类实现的情况下,持有该类型引用,间接调用原有方法,并可以在调用前后进行功能扩展,复合开闭原则。

2、通过继承或实现的方式,让扩展的子类与原有类型兼容,符合里氏替换原则。

本文由博客一文多发平台 OpenWrite 发布!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值