装饰模式(Decorator)
扩展对象的功能,即扩展出来的对象的功能强大了, 而继承是扩展类的功能(即子类的功能变强大了),因此,可以在不创造更多子类的情况下将对象的功能加以扩展
如:
DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(new FileOutputStream(new File(path))));
装饰后对象功能更强了(又带缓冲,又带文件输出)
装饰模式在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象(wrapper),来包裹真实的对象
类图:
/**
* 公共输入的接口
* @author Lyn
*/
public interface InputStream {
public int read();
}
/**
* 文件输入流(是一种节点流)
* 其它的如: ByteArrayInputStream
* @author Lyn
*/
public class FileInputStream implements InputStream {
@Override
public int read() {
System.out.println("FileInputStream:文件输入流组件,我是节点流....到文件系统上去读...");
return 0;
}
}
/**
* 抽象过滤流,此类把 读的任务交给传进来的 InputStream对象去读
* @author Lyn
*
*/
public class FilterInputStream implements InputStream {
private InputStreamis; // 真正交给该对象去读数据
public FilterInputStream(InputStream is){
this.is = is;
}
@Override
publicint read() {
System.out.println("================");
System.out.println(this.getClass());
System.out.print("我是 FilterInputStream 抽象过滤流,读的任务交给传进来的InputStream,即:");
System.out.println(is.getClass());
System.out.println("================");
return this.is.read();
}
}
/**
* 带缓冲的输入流
* 功能:把读的任务交给父类去读,读到数据后,在它的基础上加上自己的功能,即加上缓冲的功能
* ( 因为父类又交给传进来的 InputStream去读,所以,总的就交给了传进来的InputStream去读)
* @authorlyn
*
*/
public class BufferedInputStream extends FilterInputStream {
public BufferedInputStream(InputStream is) {
super(is);
}
@Override
public int read() {
super.read(); //交给传进来的 InputStream去读
this.doBuffer(); //加上自己会缓冲的功能
return 0;
}
private void doBuffer(){
System.out.println("在读到的数据加上 缓冲的功能");
}
}
/**
* 与机器无关读取基本 Java数据类型功能的输入流
*
* 功能:把读的任务交给父类去读,读到数据后,在它的基础上加上自己的功能,即加上与机器无关读取基本 Java 数据类型功能
*
* ( 因为父类又交给传进来的 InputStream去读,所以,总的就交给了传进来的InputStream去读)
* @author lyn
*
*/
public class DataInputStream extends FilterInputStream {
public DataInputStream(InputStream is) {
super(is);
}
@Override
publicint read() {
super.read(); //交给传进来的 InputStream去读
this.doData(); //加上与机器无关读取基本 Java数据类型功能
return 0;
}
privatevoid doData(){
System.out.println("在读到的数据加上 与机器无关读取基本 Java数据类型功能 ");
}
}