装饰器模式,顾名思义,就是将某个类重新装扮一下,使得它比原来的功能更加强大,这就是装饰器所要达到的目的。但是作为原来这个类的使用者,不应感受到装饰前和装饰后有什么不同,否则就破坏了原有类的结构了,所以装饰器模式要做到对被装饰类的使用者透明,这是对装饰器模式最基本的要求。
装饰器模式的结构
下图是一个装饰器模式的典型的类图结构,各个角色的描述如下:
- Component:抽象组件角色,定义一组抽象的接口,规定被装饰组件有哪些功能
- ConcreteComponent:实现这个抽象组件的所有功能
- Decorator:装饰器角色,它持有Component角色的引用,定义一个和抽象组件一致的接口-
- ConcreteDecorator:装饰器的具体实现,负责实现装饰器角色定义的功能
Java IO中的装饰器模式
装饰器模式的作用就是赋予被装饰器的类更多的功能,在Java IO类库中,有很多不同的功能组合情况,这些不同的功能组合就是使用装饰器模式实现的,下面以FilterInputStream为例来说明。
InputStream类就是以抽象组件的角色存在的,而FileInputStream就是具体实现抽象组件所有功能的组件,FilterInputStream是装饰器角色,他实现了InputStream的所有接口,并且持有InputStream对象的引用,BufferedInputStream就是具体装饰器的实现者,它给InputStream添加了附加功能,使得InputStream读取的数据放在内存中,提升读取效率。
装饰器模式和适配器模式的区别
装饰器模式和适配器模式都有一个别名就是包装模式(wrapper),它们都起到了包装一个类或则对象的作用,但是它们的使用目的不同,装饰器模式不改变被包装的接口,仅仅是争强原来接口的功能,而适配器模式要将一个接口转变为另一个接口,目的是通过改变接口达到重复使用。