设计模式之装饰者模式

作者: aserbao | 来源:发表于2018-04-05 15:02 被阅读62次
装饰者模式.jpg QQ图片20180405100209.jpg

如果你没了解过装饰者模式,那么请继续往下看,如果你是老司机,那么,你可以快速往下看。

开始装个13,再进入正文。

一如既往,你能从本文了解到如下信息:1. 一个简单的装饰者demo? 2. 什么是装饰者模式? 3. 总结。

来讲个需求

假如现在你有这么个需求,需要给咖啡馆编写一套收费系统。咖啡馆有卡布奇洛,拿铁,美式咖啡,浓缩咖啡……二十几种,配料包括:糖,奶油,牛奶,摩卡,奶泡……十几种,包装有外卖盒,精美咖啡杯,商务咖啡杯……七八种。需要帮忙设计一套收费系统。

第一种思路:
最死板的方法,每个咖啡种类,每种配料,每种包装都生成一个类,然后选择何种类就添加何种类的金额。

我点一杯加糖拿铁用漂亮杯子装计算价格及编写描述的代码就这么写:

mResult.setText("您点了:" + new BeautifulCup().description() + new Soul().description() + new Latte().description() +  + "\n一共消费了:" + new BeautifulCup().cost() + new Soul().cost() + new Latte().cost());

第二种思路:
我们在第一种思路上进行扩展, 我们建立一个基础类Matrial,所有的咖啡类,配料类,装饰类继承这个基类。再进一步,我们想办法让用户每添加一个配料都直接计算出结果,不要等最后一次性计算。

基于上面 的思路,我需要定一杯加糖拿铁的代码如下:

 mResult.setText("您点了:" + new Soul(new Latte()).description() + "\n一共消费了:" + mCoffee.cost());
public class Soul extends Material {

    private Material mMaterial;

    public Soul(Material material) {
        mMaterial = material;//将选择好的类传进来
    }

    @Override
    public int cost() {
        return 2 + mMaterial.cost();//之前所有东西的价格再添加当前配料的价格
    }

    @Override
    public String description() {
        return "加糖的" + mMaterial.description();
    }
}

第三种思路:第二种思路的实现类还是比较多的,有多少配料,有多少咖啡就得生成多少个具体实现类,我们可以再将实现类总分成三个实现类,一个Coffee类,一个Dosing类,一个Cup类。通过枚举的方式进行分类,这样就能大大减少类的数量。这里简单列举一个Coffee类,其他依葫芦画瓢就行了。

代码如下:

public class Coffee extends Material{
    private final static int CAPPUCCIO = 0;
    private final static int LATTE = 1;
    private final static int DARK = 2;
    private final static int HOUSE = 3;

    private Material mMaterial;
    private int type = 0 ;

    public Coffee(Material material, int type) {
        mMaterial = material;
        this.type = type;
    }
    @Override
    public int cost() {
        int cuurCost = 0;
        switch (type){
            case CAPPUCCIO:
                cuurCost = 22;
                break;
            case LATTE:
                cuurCost = 25;
                break;
            case DARK:
                cuurCost = 30;
                break;
            case HOUSE:
                cuurCost = 35;
                break;
        }
        if (mMaterial != null) {
            return mMaterial.cost() + cuurCost;
        }else{
            return cuurCost;
        }
    }

    @Override
    public String description() {
        String  cuurDescription = "";
        switch (type){
            case CAPPUCCIO:
                cuurDescription = "卡布奇洛";
                break;
            case LATTE:
                cuurDescription = "拿铁";
                break;
            case DARK:
                cuurDescription = "烘焙";
                break;
            case HOUSE:
                cuurDescription = "House";
                break;
        }
        if (mMaterial != null) {
            return  mMaterial.description() + cuurDescription ;
        }else{
            return cuurDescription;
        }
    }
}

看完例子,下面我们来说说什么是装饰者模式?

什么是装饰者模式?

官方一点的说法可以说:动态地给对象附加职责。字面意思理解:就是给对象进行一层包装。(就好像你给咖啡添加糖,糖就可以充当装饰者的角色)。上面的例子其实就是一个典型的装饰者模式。可以根据下面的图来进行上面案例的分析:A是用户最先的咖啡,B是配料,C是杯子。当用户在调用B的method()时,B的method方法中包含了A的method的结果。同理,C的method方法包含了B的method方法的结果。

装饰者模式.png

总结

啥嘛,还要总结,好吧,说下吧,这几天词比较穷呀!通过上面文章我们可以知道,装饰者模式主要用于需要给一个类动态扩展或者撤销附加职责,并且能在不修改任何底层源码的情况下进行。源码地址:Aserbao's Android 设计模式源码地址

最后,如果您觉得本文写的不错,就给个赞吧!如果读了本文还有疑惑或者发现可以改进的地方,请给我留言。

QQ图片20180309212123.gif

关注打赏

If you find this repository helpful, you may make a donation to me via alipay or wechat.

坚持原创技术分享,您的支持将鼓励我继续创作!

微信打赏 支付宝打赏: 微信公众号:
微信支付 这里写图片描述 aserbao

相关文章

  • JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计

    JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计模式 装饰器模式,又名装饰者模式。它的定义是“在不...

  • Java设计模式之 —— 装饰者(Decorator) — 点

    Java设计模式之 —— 装饰者(Decorator) — 点炒饭 下面会用做炒饭的例子来描述一下装饰者设计模式,...

  • 设计模式

    设计模式 单例模式、装饰者模式、

  • 设计模式笔记汇总

    目录 设计原则 “依赖倒置”原则 未完待续... 设计模式 设计模式——策略模式 设计模式——装饰者模式 设计模式...

  • java IO 的知识总结

    装饰者模式 因为java的IO是基于装饰者模式设计的,所以要了解掌握IO 必须要先清楚什么事装饰者模式(装饰者模式...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 设计模式之装饰者模式

    如果你没了解过装饰者模式,那么请继续往下看,如果你是老司机,那么,你可以快速往下看。 开始装个13,再进入正文。 ...

  • 设计模式之装饰者模式

    该模式可以避免滥用继承,在使用对象组合的方式,就能做到在运行时装饰类,此后便能在不修改任何底层代码的情况下给对象赋...

  • 设计模式之装饰者模式

    装饰者模式的定义是动态地给一个对象添加一些额外的职责。就增加功能来说,装饰者模式比生成子类更加灵活。 通常给一个对...

  • 设计模式之装饰者模式

    前言: 相信Java开发者在使用java i/o API的时候,对于以下代码写法应该非常熟悉: 在不知道具体设计实...

网友评论

本文标题:设计模式之装饰者模式

本文链接:https://www.haomeiwen.com/subject/jyxdhftx.html