如果想要扩充一个类的功能,你会打算怎么做?
- 从原有类改写代码,相信这是大家最容易想到的办法,但是这个办法有很多弊端,不能复用是它最致命的缺点,灵活性太差。
- 写一个子类去继承它,在子类扩充功能。但是还是不够灵活。
- 使用组合方式,把Component接口(或者抽象类)作为Decorator接口(或者抽象类)的一个属性,Decorator extends Component,Decorator的Operation()方法转发Component的Operation()方法,
ConcreteDecoratorA和ConcreteDecoratorB是Decorator的实现类,实现Operation()方法时,可以增加
OperationPre()方式和OprationLater()方法,实现扩充功能。
- Java中的IO是明显的装饰器模式的运用。
Component:InputStream,OutputStream,Reader,Writer
ConcreteComponent:FileInputStream(从文件中读取数据流)
Decorator:FilterInputStream,FilterOutputStream,FilterRead,FilterWriter
ConcreteDecorator:BufferedInputStream(提供一个内存的缓冲区类保存输入流中的数据)
我们经常会看到如下:
//file为某个具体文件的File或者FileDescription对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));