(设计模式)装饰器
装饰器模式:在原有的功能附加额外的功能,从而扩展和强化已有的功能,同时也保留着原有功能的效果。
例如:JDK 的 IO 包里,就有很多装饰器的例子。如下 InputStream 的 UML 图:
InputStream 是所有输入流的顶级抽象基类,其中定义了最基本的 read 方法,负责读取数据,如下:
这里以 BufferedInputStream 为例,这个类除了提供读取的功能,还能将输入流缓存起来,减少数据传输的次数。从上面的 UML 可以知道 BufferedInputStream 是集成 FilterInputStream,那看看 FilterInputStream 是怎样:
下面是 BufferedInputStream 的构造方法:
从上面可以看出,BufferedInputStream 的构造方法会把 InputStream 类型引用传给父类 FilterInputStream 并赋值给属性 in,并且初始化缓冲区 buf 的大小,用于缓冲读取到的 IO 数据。
这里缓冲的附加效果体现在 read 方法里,如下图:
其中 fill 方法里面实现就是间接调用属性 in 的 read 方法来读取数据并填充到缓冲区。
模式分析:
1、使用组合方式,在不改变原有类实现的情况下,持有该类型引用,间接调用原有方法,并可以在调用前后进行功能扩展,复合开闭原则。
2、通过继承或实现的方式,让扩展的子类与原有类型兼容,符合里氏替换原则。
本篇文章由一文多发平台ArtiPub自动发布