装饰者模式
装饰者模式
概念
装饰者模式也称为包装模式(Wrapper Pattern),属于结构型设计模式。该模式对客户端透明的方式来动态的扩展对象,(对扩展开发,对修改关闭)同时该模式也是继承关系的替代方法之一。
总之该模式就是动态的给对象添加一些额外的职责,类似于我们点咖啡加糖加奶
装饰者模式的结构分为以下几类
- 抽象组件(
Component
):定义装饰方法的规范 - 被装饰者(
ConcreteComponent
):Component
的具体实现,也就是我们要装饰的具体对象 - 装饰者组件(
Decorator
):持有组件(``)对象的实例引用,该类的职责就是为了装饰具体组件对象,定义的规范 - 具有装饰(
ConcreteDecorator
):负责给构件对象装饰附加的功能- 装饰者和被装置者有相同的超类(Component)
- 你可以用一个或多个具体装饰(ConcreteDecorator)包装一个对象
- 装饰者可以在所委托被装饰者的行为之前与/ 或之后,加上自己的行为,以达到特点的目的(类似代理模式)
- 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量的用你喜欢的装饰者来装饰对象
应用
inputStream
- 抽象组件(InputStream) :装饰者模式中的超类,它只有一个抽象方法read(),子类都需要对该方法进行处理
- 被装饰者(FileInputStream , ByteArrayInputStream , StringBufferInputStream) :拥有通用实现read()基本方法
- 装饰者组件(FilterInputStream) :定义具体装饰者的行为规范,可以做统一基础处理。
- 具体装饰(BufferedInputStream , DataInputStream , Base64InputStream) :具体的装饰类,拥有对流的读操作做完成具体拓展能力。
装饰者模式让我们可以有不同的被装饰者,例如FileInputStream,并且如果想使用缓冲功能那么只需写一下代码 :
1 | new BufferedInputStream(new FileInputStream(new File("path"))); |
也可以对上面代码再进行加工,简单的加密处理 :
1 | new Base64InputStream(new BufferedInputStream(new FileInputStream(new File(""))),0) |
哪怕你突然改需求了,读取的对象不是文件,而是文本或字符,那么可以轻松的将代码改为 :
1 | new Base64InputStream(new BufferedInputStream(new StringBufferInputStream("str")),0) |
总结
装饰者模式能够很好的增强对象的拓展功能,如果抽象组件定义的类型是人(抽象方法是攻击力)
那么被装饰者可以是“法师”,“战士”,“射手”,“肉坦”,装饰者模式可以让我们无需关注这些被装饰者(ConcreteComponent)
我们可以实现不同的装饰功能(ConcreteDecorator),例如匕首(+5),长剑(+10),法杖(+1)
OO原则:动态地将责任附加到对象上。想要扩展功能, 装饰者提供有别于继承的另一种选择。
- 继承属于扩展形式之一,但不见得是达到弹性设计的最佳方案。
- 在我们的设计中,应该允许行为可以被扩展,而不须修改现有的代码。
- 组合和委托可用于在运行时动态地加上新的行为。
- 除了继承,装饰者模式也可以让我们扩展行为。
- 装饰者模式意味着一群装饰者类, 这些类用来包装具体组件。
- 装饰者类反映出被装饰的组件类型(实际上,他们具有相同的类型,都经过接口或继承实现)。
- 装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。
- 你可以有无数个装饰者包装一个组件。
- 装饰者一般对组建的客户是透明的,除非客户程序依赖于组件的具体类型。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LIFE!