设计模式_装饰者模式

什么是装饰者模式,我们来查看它的定义:

在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

简单理解就是利用装饰者模式,用于对同一种类进行加强,扩展的处理。

如果你理解了Python的装饰器,那么装饰者模式就不难理解,不过Python中的装饰器利用了闭包来实现对函数的加强;而Java中利用的是继承父类,构造器载入子类,对子类的方法加强来实现,比如BufferReader就是对Reader下的子类增强了读取IO的效率,下面我们自己实现一个简单的BufferedReader来加深对实现装饰者模式的理解。  

public class MyBufferedReader extends Reader {

    // 私有一个子类
    private Reader in;

    // 建立一个缓冲区
    private char[] buffer = new char[1024];

    // buffer数组的index
    private int index;

    // buffer数组的实际长度
    private int count;

    public MyBufferedReader(Reader in) {
        super();
        this.in = in;
    }


    /**
     * 书写一个自己的reader方法
     * 每次读取一个字符
     * @throws IOException
     */
    public int myRead() throws IOException {
        if (count == 0) {
            // 从硬盘中读取字节到缓冲数组
            count = in.read(buffer);
            index = 0; // 此时缓冲区数组是一个新的数组,index重置为0
        }

        if (count < 0) {
            return -1;
        }
        // 从缓冲数组中取得读取的字符
        char ch = buffer[index];

        index++; // 每取出一个字节,index下表自增
        count--; // 数组字节数量自减

        return ch;
    }

    public String myReaderLine() throws IOException {
        /**
         * 每次读取到'\n'说明读取到了一行,就返回sb
         */
        StringBuilder sb = new StringBuilder();
        int ch;
        while ((ch= myRead()) != -1) {

            if (ch == '\r') {
                continue;
            }
            if (ch == '\n') {
                return sb.toString();
            }
            sb.append((char) ch);
        }
        // 读取最后一行没有换行符,判断长度大于零,返回sb
        if (sb.length() != 0) {
            return sb.toString();
        }

        // 文件读取结束
        return null;
    }

    public void myClose() throws IOException {
        in.close();
    }

    /**
     * 读取可变长度的字符
     * @param cbuf
     * @param off
     * @param len
     * @return
     * @throws IOException
     */
    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        return 0;
    }

    @Override
    public void close() throws IOException {

    }
}

 

posted @ 2018-04-15 21:04  vczh22  阅读(162)  评论(0编辑  收藏  举报