(设计模式)装饰器

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

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

image

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

image

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

image

下面是 BufferedInputStream 的构造方法:

image

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

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

image

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

image

模式分析:

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

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

本篇文章由一文多发平台ArtiPub自动发布

posted @ 2021-05-07 22:20  多元思维的开发者  阅读(34)  评论(0编辑  收藏  举报