装饰模式(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数据类型功能 "); } }