码迷,mamicode.com
首页 > 其他好文 > 详细

装饰者模式

时间:2018-04-15 21:50:42      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:str   null   就是   while   string   soft   python   nbsp   查看   

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

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

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

如果你理解了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 {

    }
}

 

装饰者模式

标签:str   null   就是   while   string   soft   python   nbsp   查看   

原文地址:https://www.cnblogs.com/shihuibei/p/8849469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!