一、装饰
1、编写一个类,实现与被包装类(数据库驱动对Connection的实现)相同的接口。(使这个类和数据库的驱动实现有着相同的行为)
2、定义一个变量,引用被包装类的实例。
3、定义构造方法,传入被包装类的实例。
4、对于要改写的方法,编写自己的代码即可。
5、对于不需要改写的方法,调用原有对象的对应方法。
二、装饰变体(BufferedReader本身就是包装类,对Reader的包装。LineNumberReader,对BufferedReader的包装,还是他的子类)
1、编写一个类,继承已经是包装类的类。
2、定义一个变量,引用被包装类的实例。
3、定义构造方法,传入被包装类的实例。
4、覆盖掉需要改写的方法
例子(对BufferedReader的包装):
MyLineNumberReader.java文件:
import java.io.BufferedReader;
import java.io.IOException;
//对BufferedReader的readLine方法进行改写,输出行号
public class MyLineNumberReader extends BufferedReader{
private int count = 1;
public MyLineNumberReader(BufferedReader br){
super(br);
}
public String readLine() throws IOException {
String data = super.readLine();
if(data==null)
return null;
return (count++)+":"+data;
}
}
测试类Test.java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
public class Test {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("src/a.txt");
BufferedReader br = new BufferedReader(reader);
MyLineNumberReader lbr = new MyLineNumberReader(br);
String data = null;
while((data = lbr.readLine())!=null){
System.out.println(data);
}
br.close();
}
}
3.a.txt文件:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
4。运行结果:
1:import java.io.BufferedReader;
2:import java.io.FileNotFoundException;
3:import java.io.FileReader;
4:import java.io.Reader;
本文介绍装饰模式的基本原理及其变体,并通过具体实例说明如何使用装饰模式来增强已存在的类的功能,而不改变其结构。文中详细解释了如何创建一个类来包装`BufferedReader`并增加行号计数功能。
1738

被折叠的 条评论
为什么被折叠?



