装饰者模式定义:
动态的为一个对象增加额外的功能。
what?啥意思。。? 其实还是遵循那个原则,对修改关闭,对扩展开放。如果要给一个类增加额外的功能,不要去修改他的代码,而是通过其他类持有它的引用,在功能前后增加所要增加的功能即可。
看程序设计,java的流体系就是用装饰者模式设计的,我们自己也来设计一套流。
顶层接口:
/**
* 输入流顶层接口
* @author Ade-rui
*
*/
public interface RInputStream {
public void read();
}
简单的功能类:
/**
* 文件流
* @author PC
*
*/
public class RFileInputStream implements RInputStream{
public void read() {
System.out.println("文件读入...");
}
}
那么这个时候需要接入一个缓存输入流呢? 缓存是一个对真正输入流的功能上的一个扩展,绝不是要重新做一个功能,所以我们需要拿到真正的输入流,再给他加上缓存的功能就可以了。
定义抽象装饰者:
/**
* 抽象装饰者
* 重点:
* 一:与普通的实现类一样需要实现功能接口
* 二:需要持有一个真正功能类的引用,这里用多态的写法,持有一个接口引用,可以接受任意子类
* @author PC
*
*/
public abstract class Decorator implements RInputStream {
private RInputStream inputStream;
public Decorator(RInputStream inputStream){
this.inputStream = inputStream;
}
}
实现缓存流:
/**
* 缓存流
* @author PC
*
*/
public class BufferFileInputStream extends Decorator {
public BufferFileInputStream(RInputStream inputStream) {
super(inputStream);
}
public void read() {
System.out.println("拿到流数据,装入到缓存池中..");
if(isPoolHasData){
pool.read();
}else{
inputStream.read();
}
}
}
这就是我们常见的Buffer功能的实现,他内部是持有真正流的引用,然后加上了自身的缓存功能实现的。
所以我们调用的时候也是这样:
public class Client {
public static void main(String[] args) {
//我们自己写的
RInputStream inputStream = new BufferFileInputStream(new RFileInputStream());
//系统的
InputStream inputStream2 = new BufferedInputStream(new FileInputStream(new File("")));
}
}