设计模式<c++> (4)装饰者模式

复制代码
#include <iostream>
class Beverage {    //饮料 超类
public :
    //std::string description = "未知饮料";        思考,为何这样使用成员变量不行?????????????????????????????????????????
    virtual std::string getDescription() {
        return "未知饮料";
    }
    virtual double cost() = 0;
};


class CondimentDecorator :public Beverage {//调料品 超类
public:
    virtual std::string getDescription()=0;
};



class Espresso :public Beverage {    //浓缩咖啡饮料
public:
    std::string getDescription() {
        return "浓缩咖啡饮料";
    }
    double cost() {
        return 1.99;
    }
};

class HouseBlend :public Beverage {    //家常咖啡饮料
public:
    std::string getDescription() {
        return "家常咖啡饮料";
    }

    double cost() {
        return 1.88;
    }
};

//下面定义装饰者
class Mocha :public CondimentDecorator {
public:
    Beverage *beverage;

    Mocha(Beverage *beverage) {
        this->beverage = beverage;
    }

    std::string getDescription() {
        return beverage->getDescription() + ",摩卡味";
    }

    double cost() {
        return 2.0 + beverage->cost();
    }
};

class Soy :public CondimentDecorator {
public:
    Beverage* beverage;

    Soy(Beverage* beverage) {
        this->beverage = beverage;
    }

    std::string getDescription() {
        return beverage->getDescription() + ",大豆味";
    }

    double cost() {
        return 4.0 + beverage->cost();
    }
};

class Whip :public CondimentDecorator {
public:
    Beverage* beverage;

    Whip(Beverage* beverage) {
        this->beverage = beverage;
    }

    std::string getDescription() {
        return beverage->getDescription() + ",奶油味";
    }
    double cost() {
        return 9.9 + beverage->cost();
    }
};

int  main() {
    Beverage *beverage1 = new Espresso();
    std::cout << beverage1->getDescription() <<"   价格:" <<beverage1->cost()<<std::endl;

    Beverage *beverage2 = new HouseBlend();
    std::cout << beverage2->getDescription() << "   价格:" << beverage2->cost()<<std::endl;

    beverage2 = new Whip(beverage2);
    beverage2 = new Soy(beverage2);
    beverage2 = new Mocha(beverage2);
    std::cout << beverage2->getDescription() << "   价格:" << beverage2->cost() << std::endl;
    

    delete beverage1;
    delete beverage2;
    return 0;
}
复制代码

 

 

posted @   一梦、  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示