package day02;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
* 装饰者模式
* 这个例子是解决我们get方式乱码的前驱
*
* @author mzy
*
*/
public class DecoratorPatternDemo {
/*
* 需求:
* 我们对IO流的工具进行装饰,形成我们特有的方式
* 例如:
* 给IO流加上行号
* 思考和实现:
* 其实就是对BufferedReader中的readLine方法进行增强。
* 做一个我们的BufferedReader类(MyBufferdReader):
* 其中的bufferedReader就是被装饰类,MyBufferdReader就是装饰类
*
* 装饰者模式的要求: 装饰者和被装饰者
* 1.被装饰者不能是被final修饰的
* 2.在装饰者类中定义一个成员变量来接收被装饰者类的对象。
* 3.在装饰者类的构造方法中传入被装饰者类,使用前面定义的成员变量来存放被装饰者对象。
* 4.在被装饰者类中重写被装饰者的方法来进行特定的增强。
*/
public static void main(String[] args) throws Exception {
/*
* 给BufferdReader前面加上行号
*/
BufferedReader br = new BufferedReader(new FileReader("e:/news.txt"));
// 对BufferedReader进行装饰
BufferedReader reader = new MyBufferedReader(br);
String str;
while((str=reader.readLine()) != null) {
System.out.println(str);
}
}
}
// 1. 首先确定了 不是final修饰的
// 装饰者:MyBufferedReader 被装饰者:BufferedReader
class MyBufferedReader extends BufferedReader {
// 2.在装饰类中定义一个成员变量,用于接收被装饰者类的对象。
private BufferedReader in;
/*
* 3.在装饰者类中传入被装饰者的对象,使用定义的变量接收传入的被装饰者类。
*/
public MyBufferedReader(Reader in) {
super(in);
this.in = (BufferedReader)in;
}
int count = 1;
/*
* 4.在装饰类中重写被装饰类方法,对其方法进行增强。
*/
@Override
public String readLine() throws IOException {
// 得到原来的真实的内容
String content = in.readLine();
if(content != null) {
content = count+": "+content;
count++;
}
return content;
}
}