包装设计模式的实现以改进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();
        }

    }

}
原文地址:https://www.cnblogs.com/liun1994/p/3984735.html