zoukankan      html  css  js  c++  java
  • 设计模式_装饰者模式

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

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

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

    如果你理解了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 {
            /**
             * 每次读取到'
    '说明读取到了一行,就返回sb
             */
            StringBuilder sb = new StringBuilder();
            int ch;
            while ((ch= myRead()) != -1) {
    
                if (ch == '
    ') {
                    continue;
                }
                if (ch == '
    ') {
                    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 {
    
        }
    }
  • 相关阅读:
    codechef Dynamic GCD [树链剖分 gcd]
    bzoj 4546: codechef XRQRS [可持久化Trie]
    bzoj 4835: 遗忘之树 [树形DP]
    bzoj 4033: [HAOI2015]树上染色 [树形DP]
    bzoj 4591: [Shoi2015]超能粒子炮·改 [lucas定理]
    3167: [Heoi2013]Sao [树形DP]
    bzoj 3812: 主旋律 [容斥原理 状压DP]
    有标号的二分图计数 [生成函数 多项式]
    有标号DAG计数 [容斥原理 子集反演 组合数学 fft]
    BZOJ 3028: 食物 [生成函数 隔板法 | 广义二项式定理]
  • 原文地址:https://www.cnblogs.com/shihuibei/p/8849469.html
Copyright © 2011-2022 走看看