l当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强:
•编写子类,覆盖需增强的方法
•使用Decorator设计模式对方法进行增强
l疑问:在实际应用中遇到需增强对象的方法时,到底选用哪种方式呢?
•没有具体的定式,不过有一种情况下,必须使用Decorator设计模式:
即被增强的对象,开发人员只能得到它的对象,无法得到它的
class
文件。
•比如request、response对象,开发人员之所以在servlet中能通过sun公司定义的HttpServletRequest\response接口去操作这些对象,是因为Tomcat服务器厂商编写了request、response接口的实现类。web服务器在调用servlet时,会用这些接口的实现类创建出对象,然后传递给servlet程序。
•此种情况下,由于开发人员根本不知道服务器厂商编写的request、response接口的实现类是哪个?在程序中只能拿到服务器厂商提供的对象,因此就只能采用Decorator设计模式对这些对象进行增强。
/*
* 包装设计模式* 1.实现与被增强对象相同的接口
* 2.定义一个变量记住被增强对象
* 3.定义一个构造器,接收被增强对象
* 4.覆盖需要增强的方法
* 5.对于不想增强的方法,直接调用被增强的对象的方法
*/
package cn.itcast.wrapper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
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 {
String line = br.readLine();
if (line == null) {
return line;
} else {
return linenum++ + ":" + line;
}
}
}
对应的测试类
package cn.itcast.wrapper;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestBufferedReaderWrapper {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(
"src/cn/itcast/wrapper/BufferedReaderWrapper.java"));
BufferedReaderWrapper wrapper = new BufferedReaderWrapper(br);
FileWriter fw = new FileWriter("d:\\1.java");
String line = null;
while ((line = wrapper.readLine()) != null) {
fw.write(line + "\r\n");
}
fw.close();
wrapper.close();
br.close();
}
}