概念

装饰模式处理两种类:装饰类和被装饰类。为了让多个装饰类装饰一个对象,让装饰类的 interfaceextends 被装饰类的 interface,保持实例类型一致。

下面拿一碗面来举例,并且采用 interface 去实现,而没有用 abstract 。简单的抽象行为,抽象的方式依据具体业务。

例子

面条接口

//显示面条信息的接口
public interface INoodles {
    String info();
}

装饰面条的接口

//继承装饰者接口实现实例的组合
public interface INoodlesDecorator extends INoodles{}

裸面类

public class Noodles implements INoodles{
    @Override
    public String info() {
        return "裸面";
    }
}

荷包蛋类

public class PoachedEggsDecorator implements INoodlesDecorator{
    private INoodles iNoodles;

    public PoachedEggsDecorator(INoodles iNoodles) {
        this.iNoodles = iNoodles;
    }
    @Override
    public String info() {
        return iNoodles.info()+" + 荷包蛋";
    }
}

卷心菜类

public class CabbageDecorator implements INoodlesDecorator{
    private INoodles iNoodles;

    public CabbageDecorator(INoodles iNoodles) {
        this.iNoodles = iNoodles;
    }
    @Override
    public String info() {
        return iNoodles.info()+" + 卷心菜";
    }
}

执行类:RunMain

public class RunMain {
    public static void main(String[] args){
        Noodles noodles =new Noodles();                                                // 创建裸面

        PoachedEggsDecorator poachedEggsDecorator =new PoachedEggsDecorator(noodles);  // 加入荷包蛋,成为了被装饰者
        CabbageDecorator cabbageDecorator =new CabbageDecorator(poachedEggsDecorator); // 加入卷心菜

        System.out.println(cabbageDecorator.info());                                   // 打印点菜信息
    }
}
裸面 + 荷包蛋 + 卷心菜