装饰者模式

场景:去吃黄焖鸡米饭,发现除了黄焖鸡米饭外,还可以额外的加菜些配菜(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+"元");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
装饰者模式(Decorator Pattern)的类图包含以下几个角色: - Component:抽象构件角色,定义一个抽象接口,用来规范具体构件角色和装饰角色的行为。 - ConcreteComponent:具体构件角色,实现 Component 接口,或者继承抽象类 Component,并实现其方法。 - Decorator:抽象装饰角色,继承或实现 Component 接口,包含一个指向 Component 对象的引用,并定义一个与 Component 接口一致的接口。 - ConcreteDecorator:具体装饰角色,继承或实现 Decorator 类,包含一个指向 Component 对象的引用,并可以增加一些额外的功能。 装饰者模式的类图示例如下: ``` +-------------------------+ | Component | +-------------------------+ | +operation() | +-------------------------+ /\ | +-------------------------+ | ConcreteComponent | +-------------------------+ | +operation() | +-------------------------+ /\ | | +-------------------------+ | Decorator | +-------------------------+ | -component: Component | +-------------------------+ /\ | | +-------------------------+ | ConcreteDecorator | +-------------------------+ | -component: Component | | +operation() | +-------------------------+ ``` 在上面的类图中,Component 是抽象构件角色,定义了一个抽象接口 operation(),ConcreteComponent 是具体构件角色,实现了 Component 接口,并且定义了具体的业务方法。Decorator 是抽象装饰角色,继承或实现了 Component 接口,包含一个指向 Component 对象的引用,并定义了一个与 Component 接口一致的接口。ConcreteDecorator 是具体装饰角色,继承或实现了 Decorator 类,包含一个指向 Component 对象的引用,并可以增加一些额外的功能。 在装饰者模式中,客户端可以使用一个或多个装饰器来动态地改变一个对象的行为,而不需要修改原始对象的代码。通过将对象包装在一系列装饰器中,可以在运行时动态地添加或删除功能,从而实现更灵活、更可扩展的设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值