装饰者设计模式

发布于 2021-05-26  118 次阅读


使用场景:

给某个对象的功能进行扩展时,可以考虑使用装饰者设计模式。
在IO流这部分内容中,JDK的源码使用了大量的装饰者设计模式。比如BufferedReader可以对FileReader进行装饰。
以去拉面馆吃拉面为例,一碗面做好后都会向里面加料装饰,所以先定义一个装饰拉面的接口,提供一个加料的方法

/**
 * 装饰拉面
 *
 */
public interface NoodleDecorate {

    //向拉面中加料
    void addThings();
}

创建一个拉面(Noodle)类实现NoodleDecorate接口

/**
 * 普通拉面
 *
 */
public class Noodle implements NoodleDecorate {

    //普通拉面做好后,会向里面添加一些东西
    @Override
    public void addThings() {
        System.out.println("加两片肉末");
        System.out.println("加一片萝卜");
        System.out.println("加三根香菜");
    }
}

普通的拉面做好之后,有人爱吃辣椒,想在拉面中添加辣椒,创建一个辣椒拉面(ChiliNoodle)类

/**
 * 拉面加辣椒
 *
 */
public class ChiliNoodle implements NoodleDecorate {

    //普通拉面
    private Noodle noodle;

    /**
     * 将普通拉面对象传入
     * @param noodle
     */
    public ChiliNoodle(Noodle noodle) {
        this.noodle = noodle;
    }

    /**
     * 对普通拉面进行升级
     */
    @Override
    public void addThings() {
        //普通拉面
        noodle.addThings();
        //在普通拉面中添加辣椒
        System.out.println("加三勺辣椒");
    }
}

Demo

public class NoodleTest {

    public static void main(String[] args) {
        Noodle noodle = new Noodle();
        //noodle.addThings();
        ChiliNoodle cn = new ChiliNoodle(noodle);
        cn.addThings();
    }
}

装饰者设计模式的优点:

不用修改被装饰对象的源码,装饰者与被装饰者耦合度不高。