装饰者模式定义:
动态的为一个对象增加额外的功能。
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(""))); } }看看有区别吗? 必须没有啊,java的流体系是一个再正规不过的装饰者模式了。