黑马程序员_ReadLine_装饰设计模式_LineNumberReader

---------------------- android培训、java培训、期待与您交流! ---------------------- 

ReadLine的原理图

黑马程序员_ReadLine_装饰设计模式_LineNumberReader_第1张图片
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReader2 {

	public static void main(String[] args) {
		
		FileReader fr = null;
		BufferedReader bufr = null;
		try {
			fr =new  FileReader("Demo.txt");
			bufr = new BufferedReader(fr);
			
			String value = null;
			while((value = bufr.readLine()) != null){
				System.out.println(value);
			}
		} catch (Exception e) {
			System.out.println(e.toString());
		}finally{
			if(bufr != null){
				try {
					bufr.close();
				} catch (IOException e) {
					System.out.println(e.toString());
				}
			}
		}
	}
}


装饰设计模式

1. 装饰模式(Decorator)的定义:又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
2. 装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。换言之客户端并不会觉的对象在装饰前和装饰后有什么区别。
3. 装饰模式可以在不创造更多的子类的模式下,将对象的功能加以扩展。
4. 装饰模式与类继承的区别:
  • 1) 装饰模式是一种动态行为,对已经存在类进行随意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。 
  • 2) 装饰模式扩展的是对象的功能,不需要增加类的数量,而类继承扩展是类的功能,在继承的关系中,如果我们想增加一个对象的功能,我们只能通过继承关系,在子类中增加两个方法。 
  • 3) 装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象,也就是装饰来包裹真是的对象。 
5.装饰类因为增强已有对象,具备功能和已有的是相同的,只不过提供了更强功能,所以装饰类和被装饰类通常是属于一个体系
6.装饰类比继承灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。

LineNumberReader

public class LineNumberReader
extends BufferedReader
跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。
默认情况下,行编号从 0 开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用 setLineNumber(int) 更改行号。但要注意的是,setLineNumber(int) 不会实际更改流中的当前位置;它只更改将由 getLineNumber() 返回的值。 可认为行在遇到以下符号之一时结束:换行符('\n')、回车符('\r')、回车后紧跟换行符。
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class LineNumberReaderDemo {

	public static void main(String[] args) {
		LineNumberReader lnr = null;
		try {
			lnr = new LineNumberReader(new FileReader("Demo2.txt"));
			String line = null;
			//设置起始行号
			lnr.setLineNumber(100);
			while((line = lnr.readLine()) != null){
				System.out.println(lnr.getLineNumber() + ":" +line);
			}
		} catch (Exception e) {
			throw new RuntimeException("文件读取异常");
		}finally{
			if(lnr != null){
				try {
					lnr.close();
				} catch (IOException e) {
					System.out.println(e.toString());
				}
			}
		}
	}
}

自定义LineNumberReader

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/*
 * 模拟一个带行号的缓冲区对象
 */
public class MyLineNumberReaderTest {

	public static void main(String[] args) {
		MyLineNumberReader lnr = null;
		try {
			lnr = new MyLineNumberReader(new FileReader("Demo2.txt"));
			String line = null;
			// 设置起始行号
			// lnr.mySetLineNumber(100);
			while ((line = lnr.myReadLine()) != null) {
				System.out.println(lnr.myGetLineNumber() + ":" + line);
			}
		} catch (Exception e) {
			throw new RuntimeException("文件读取异常");
		} finally {
			if (lnr != null) {
				try {
					lnr.close();
				} catch (IOException e) {
					System.out.println(e.toString());
				}
			}
		}
	}
}

// 自定义LineNumber类 继承BufferReader提高了类的复用率
class MyLineNumberReader extends BufferedReader {

//	private Reader fr;
	private int lineNumber;

	MyLineNumberReader(Reader fr) {
		super(fr);
	}

	String myReadLine() throws IOException {
		//如果当时没使用变量值,++i 和i++ 作用一样
		lineNumber++;
		return super.readLine();
		//下面的代码和bufferedReader中readLine重复
//		StringBuilder sb = new StringBuilder();
//		int temp = 0;
//		while ((temp = fr.read()) != -1) {
//			if (temp == '\r')S
//				continue;
//			if (temp == '\n'){
//				return sb.toString();
//			}
//				
//			sb.append((char) temp);
//		}
//		if (sb.length() != 0) {
//			return sb.toString();
//		}
//		return null;
	}

	int myGetLineNumber() {
		return lineNumber;
	}

	void mySetLineNumber(int lineNumber) {
		this.lineNumber = lineNumber;
	}

	// 谁调用谁处理异常,抛出留给调用的类处理 父类已有此方法不用重写
//	void myClose() throws IOException {
//		fr.close();
//	}
}
---------------------- android培训、java培训、期待与您交流! ---------------------- 


你可能感兴趣的:(黑马程序员_ReadLine_装饰设计模式_LineNumberReader)