设计模式-装饰者模式

    xiaoxiao2021-03-25  155

    装饰者模式定义:

    动态的为一个对象增加额外的功能。

    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的流体系是一个再正规不过的装饰者模式了。

    转载请注明原文地址: https://ju.6miu.com/read-9040.html

    最新回复(0)