• 包装设计模式的实现以改进BufferedReader中的readLine方法为例


    • 实现与目标对象相同的接口     BufferedReader
    • 定义一个变量记住目标对象
    • 定义一个构造器接收被增强对象
    • 覆盖需要增强的方法
    • 对于不想增强的方法,直接调用目标对象的方法。
    package cn.liuning.demo;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.Reader;
    
    /*
     1.实现与目标对象相同的接口     BufferedReader
     2.定义一个变量记住目标对象
     3.定义一个构造器接收被增强对象
     4.覆盖需要增强的方法
     5.对于不想增强的方法,直接调用目标对象的方法。
     
     */
    
    //继承BufferedReader相当于实现了他的接口,是BufferedReader子类的同时又是BufferedReader的包装类
    //覆写他的方法的时候,不采用父类继承的方式,全部调用目标资源的方法,这就成了包装类了。
    public class BufferedReaderWrapper extends BufferedReader {
    
        
        private BufferedReader br;
        private int linenum=1;
        
        //通过构造函数接受被增强对象
        public BufferedReaderWrapper(BufferedReader in) {
            super(in);//显示调用父类的构造函数。使得语法不出错
            this.br=in;
        }
        //覆盖想覆盖的方法就可以了
        @Override
        public String readLine() throws IOException {
            // TODO 自动生成的方法存根
            //return super.readLine();原始的是调用父类的readLine();
            String line = br.readLine();
            if(line == null)
            {
                return line;
            }
            return linenum++ +":"+line;
        }
    
        //其他方法从父类继承,便实现了对于不想增强的方法,直接调用目标对象的方法。
    
    }
    
    package cn.liuning.demo;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class Test {
    
        
        public static void main(String[] args) {
            try {
                BufferedReader br=new BufferedReader(new FileReader("src/cn/liuning/demo/BufferedReaderWrapper.java"));
                BufferedReaderWrapper wrapper = new BufferedReaderWrapper(br);
                String line=null;
                while((line = wrapper.readLine())!=null)
                {
                    System.out.println(line);
                }
            
            } catch (FileNotFoundException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
    
        }
    
    }
  • 相关阅读:
    个人网站上线
    从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
    Triangle
    Hard problem
    [置顶] Android AlarmManager实现不间断轮询服务
    Python学习入门基础教程(learning Python)--5.1 Python下文件处理基本过程
    编程之美 裴波那楔数列
    130712周赛(CF)
    Python学习入门基础教程(learning Python)--5.2 Python读文件基础
    phantomjs
  • 原文地址:https://www.cnblogs.com/liun1994/p/3984735.html
Copyright © 2020-2023  润新知