装饰模式(Decorator)

来源:互联网 发布:creis中指数据 账号 编辑:程序博客网 时间:2024/05/01 22:29

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