装饰者模式

场景:去吃黄焖鸡米饭,发现除了黄焖鸡米饭外,还可以额外的加菜些配菜(Garnish )

分析:
黄焖鸡和配菜都是食物(Food),黄焖鸡是主菜,其他的是配菜,配菜就属于装饰者。

装饰者模式:个人愚见就是给主菜中添加一些配菜,添加装饰作用。有一点很重要,就是在不改变类的行为的情况下,给它添加额外的功能。这里涉及到一个原则:开闭原则(对拓展开放,对修改关闭)

当然,通过继承也可以实现,但是继承的耦合性太强,而且不好组合,所以遇到相类似的场景,要考虑装饰者模式哦。不过装饰者有一个弊端,就是需要创建比较多的类。

类图:
这里写图片描述


public abstract class Food {
    /**
     * 买食物需要花费
     */
    public abstract float cost();

    /**
     * 描述
     */
    public abstract String getDescribe();
}

public abstract class Garnish extends Food {//配菜---也就是装饰者
    public Food food;
    public Garnish(Food food){
        this.food = food;
    }
}
public class GreenVegettables extends Garnish {

    public GreenVegettables(Food food) {
        super(food);
    }

    @Override
    public float cost() {
        return food.cost()+2.0f;
    }

    @Override
    public String getDescribe() {
        return food.getDescribe()+",青菜";
    }
}
public class Potato extends Garnish {

    public Potato(Food food) {
        super(food);
    }

    @Override
    public float cost() {
        return food.cost()+2.0f;
    }

    @Override
    public String getDescribe() {
        return food.getDescribe()+",土豆";
    }
}
public class Mushroom extends Garnish {
    public Mushroom(Food food) {
        super(food);
    }

    @Override
    public float cost() {
        return food.cost()+3.0f;
    }

    @Override
    public String getDescribe() {
        return food.getDescribe()+",香菇";
    }
}

public class HuangMenJi extends Food {

    private Size size = Size.MIN_SIZE;
    private Hot hot = Hot.MIN;

    public enum Size {
        MAX_SIZE, MIN_SIZE, MIDDLE_SIZE
    }

    public enum Hot {
        MIN, MIDDLE, MAX, SUPER_MAX
    }

    @Override
    public float cost() {
        switch (size) {
            case MAX_SIZE:

                return 22.0f;
            case MIDDLE_SIZE:

                return 19.0f;
            case MIN_SIZE:

                return 16.0f;
        }
        return 0.0f;
    }

    @Override
    public String getDescribe() {
        return "黄焖鸡米饭" + ","+getSize()+","+getHot();
    }

    public void setSize(Size size) {
        this.size = size;
    }

    public void setHot(Hot hot) {
        this.hot = hot;
    }

    private String getSize() {
        switch (size) {
            case MAX_SIZE:

                return "大份";
            case MIDDLE_SIZE:

                return "中份";
            case MIN_SIZE:

                return "小份";
        }
        return null;
    }

    private String getHot() {
        switch (hot) {
            case MIN:
                return "微辣";
            case MIDDLE:
                return "中辣";
            case MAX:
                return "重辣";
            case SUPER_MAX:
                return "变态辣";
        }
        return "微辣";//默认微辣
    }
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        HuangMenJi huangMenJi = new HuangMenJi();
        huangMenJi.setSize(HuangMenJi.Size.MAX_SIZE);
        huangMenJi.setHot(HuangMenJi.Hot.SUPER_MAX);
        Mushroom mushroom = new Mushroom(new GreenVegettables(new Potato(huangMenJi)));
        String describe = mushroom.getDescribe();
        float cost = mushroom.cost();
        Log.e("zhang", "菜单:"+describe+"    需要支付:"+cost+"元");
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值