现在的位置: 首页 > 综合 > 正文

装饰模式(Decorator)

2018年04月04日 ⁄ 综合 ⁄ 共 1835字 ⁄ 字号 评论关闭

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

    } 
}
【上篇】
【下篇】

抱歉!评论已关闭.