zoukankan      html  css  js  c++  java
  • 装饰器模式

    其中IO流是最经典的装饰器模式的使用

    利用装饰器模式自己实现读取文本

    public class MyBufferReader extends Reader{
    	
    	private Reader in;
    	
    	public MyBufferReader(Reader reader) {
    		this.in = reader;
    	}
    
    	@Override
    	public int read(char[] cbuf, int off, int len) throws IOException {
    		return 0;
    	}
    
    	@Override
    	public void close() throws IOException {
    		in.close();
    	}
    	
    	public String readWithLine() throws Exception{
    		StringBuilder sb = new StringBuilder();
    		int i;
    		while(true){
    			i = in.read();
    			if(i == '
    '){
    				continue;
    			}
    			if(i == '
    ' || i == -1){
    				break;
    			}
    			sb.append((char)i);
    		}
    		if(sb.toString().length() == 0){
    			if(i == '
    '){
    				return "";
    			}else{
    				return null;
    			}
    		}
    //		return (count ++) + "_" + sb.toString();
    		return sb.toString();
    	}
    	
    	public static void main(String[] args) throws Exception {
    		
    		//这是重写的方法
    		Reader reader = new FileReader("D:/1.txt");
    		MyBufferReader br = new MyBufferReader(reader);
    		String line;
    		while((line = br.readWithLine()) != null){
    			System.out.println(line);
    		}
    		br.close();
    		//这是原生的方法
    //		Reader reader = new FileReader("D:/1.txt");
    //		BufferedReader br = new BufferedReader(reader);
    //		String line;
    //		while((line = br.readLine()) != null){
    //			System.out.println(line);
    //		}
    //		br.close();
    	}
    }
    

    image

    利用装饰器模式自己实现读取文本(带行号)

    原生行号的类是LineNumberReader

    public class MyLineNumberReader extends MyBufferReader{
    
    	private int lineNumber;
    	
    	public MyLineNumberReader(Reader reader) {
    		super(reader);
    	}
    	
    	public int getLineNumber() {
    		return lineNumber;
    	}
    
    	@Override
    	public String readWithLine() throws Exception {
    		String line = super.readWithLine();
    		if(null != line){
    			lineNumber ++;
    		}
    		return line;
    	}
    	
    	public static void main(String[] args) throws Exception {
    		//这是重写的方法
    		Reader reader = new FileReader("D:/1.txt");
    		MyLineNumberReader br = new MyLineNumberReader(reader);
    		String line;
    		while((line = br.readWithLine()) != null){
    			System.out.println(br.getLineNumber() + ":" + line);
    		}
    		br.close();
    	}
    }
    

    image

  • 相关阅读:
    Swift
    Swift
    Swift
    Mac
    Mac
    Sqlite数据库 找不到请求的 .Net Framework Data Provider。可能没有安装
    Couchbase的web管理员后台 查看缓存提示警告 Warning: Editing of document with size more than 2.5kb is not allowed的解决方法
    转:asmx迷10分钟升级成wcf熟手指南
    .net4.0下 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误
    Windows系统下Memcached缓存系列二:CouchbaseClient(c#客户端)的详细试用,单例模式
  • 原文地址:https://www.cnblogs.com/kaka-qiqi/p/14861982.html
Copyright © 2011-2022 走看看