java中装饰者模式

跟風遠走 提交于 2019-12-09 23:08:35

java中装饰者模式

package com.company01.Decorator;

public abstract class Reader {
    public abstract void close();
}

package com.company01.Decorator;
/*
    需求:对FileReader类中close()方法进行扩展,并且不能改变FileReader

        1.使用继承(但是关联性太强了,代码耦合度太高,不利于项目的扩展。)-->可以理解为 父子关系

        2.这里介绍一种方法:装饰者模式。-->可以理解为朋友之间的关系
*/
public class FileReader extends Reader {
    public void close(){
        System.out.println("FileReader closed!");
    }
}

package com.company01.Decorator;
/*
    使用BufferedReader对FileReader中的close方法进行扩展

    1.装饰者模式中要求:装饰者中含有被装饰者的引用
    2.装饰者模式中要求:装饰者和被装饰者应该实现同一个接口或者类型。
*/

public class BufferedReader extends Reader{  // BufferedReader 装饰者

    //FileReader reader;    // FileReader 就是被装饰者
    // 这里也可以使用多态
    Reader reader;

    // Constructor
    //BufferedReader(FileReader reader){
    BufferedReader(Reader reader){
        this.reader = reader;
    }

    // 对FileReader中的close方法进行扩展
    public void close(){
        //扩展
        System.out.println("扩展代码1");
        reader.close();
        System.out.println("扩展代码2");
    }
}

package com.company01.Decorator;
/*
    【注】通过这个例子明白:

        为什么在前面讲的 包装流 或者 处理流 中,只需要关闭外层的流就可以了,不需要关闭内层的。
        这是因为装饰者模式

*/
public class DecoratorTest {
    public static void main(String[] args) {

        /*
        // 1.创建被装饰者
        FileReader fr = new FileReader();

        // 2.创建装饰者
        BufferedReader br = new BufferedReader(fr);
        */

        // 其实就是
        BufferedReader br = new BufferedReader(new FileReader());

        // 3.通过执行装饰者中的方法间接去执行被装饰者中的方法
        br.close();

        /*
        扩展代码1
        FileReader closed!
        扩展代码2
        */

    }


}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!