门面模式 与 装饰器模式(2)

六、装饰器模式代码示例


门面模式 与 装饰器模式(2)


来看一个这样的场景,上班族白领其实大多有睡懒觉的习惯,每天早上上班都是踩点,于是很多小伙伴为了多赖一会儿床都不吃早餐。那么,也有些小伙伴可能在上班路上碰到卖煎饼的路边摊,都会顺带一个到公司茶水间吃早餐。卖煎饼的大姐可以给你的煎饼加鸡蛋,也可以加香肠。


首先创建一个煎饼Battercake类:


public class Battercake {

    protected String getMsg(){ return "煎饼";}

    public int getPrice(){ return 5;}
}


创建一个加鸡蛋的煎饼BattercakeWithEgg类:


public class BattercakeWithEgg extends Battercake {
    @Override 
    protected String getMsg(){ return super.getMsg() + "+1个鸡蛋";}

    @Override 
    //加一个鸡蛋加 1 块钱 
    public int getPrice(){ return super.getPrice() + 1;}
}


再创建一个既加鸡蛋又加香肠的BattercakeWithEggAndSausage类:


public class BattercakeWithEggAndSauage extends BattercakeWithEgg {
    @Override
    protected String getMsg(){ return super.getMsg() + "+1根香肠";}

    @Override
    //加一个香肠加 2 块钱
    public int getPrice(){ return super.getPrice() + 2;}
}


编写客户端测试代码:


public class Test {
    public static void main(String[] args) {
        Battercake battercake = new Battercake();
        System.out.println(battercake.getMsg() + ",总价:" + battercake.getPrice());

        BattercakeWithEgg battercakeWithEgg = new BattercakeWithEgg();
        System.out.println(battercakeWithEgg.getMsg() + ",总价:" + battercakeWithEgg.getPrice());

        BattercakeWithEggAndSauage battercakeWithEggAndSauage = new BattercakeWithEggAndSauage();
        System.out.println(battercakeWithEggAndSauage.getMsg() + ",总价:" + battercakeWithEggAndSauage.getPrice());
    }


运行结果:


煎饼,总价:5
煎饼+1个鸡蛋,总价:6
煎饼+1个鸡蛋+1根香肠,总价:8


运行结果没有问题。


但是,如果用户需要一个加2个鸡蛋加1根香肠的煎饼,那么用我们现在的类

结构是创建不出来的,也无法自动计算出价格,除非再创建一个类做定制。如果需求再变,一直加定制

显然是不科学的。那么下面我们就用装饰器模式来解决上面的问题。


首先创建一个建煎饼的抽象

Battercake类:


public abstract class Battercake {

    protected abstract String getMsg();

    protected abstract int getPrice();
}
上一篇:享元模式与组合模式(3)


下一篇:Docker——Image的原理(四)(3)