我理解的装饰器模式

发布于 2022-09-11 20:42:21 字数 1503 浏览 24 评论 0

//定义一个原始的抽象类煎饼
class Pancake {
public:
    std::string name;
    int price = 0;
    virtual ~Pancake() = default;
};

//具体的装饰器基类
class MeatPancake : public Pancake {
public:
    MeatPancake() {
        this->name  = "肉煎饼";
        this->price = 5;
    }

};

//具体的装饰器基类
class EggPancake : public Pancake {
public:
    EggPancake() {
        this->name  = "鸡蛋煎饼";
        this->price = 3;
    }
};

//抽象装饰类
class PancakeDecorator : public Pancake {
protected:
    Pancake* _pancake = nullptr;//维护一个Pancake对象的引用,为Pancake对象添加装饰
public:
    explicit PancakeDecorator(Pancake* pancake) : _pancake(pancake) {
    }
    ~PancakeDecorator() override = default;
};

class Egg : public PancakeDecorator {
public:
    explicit Egg(Pancake* pancake) : PancakeDecorator(pancake) {
       this->name  = pancake->name  + " + 鸡蛋";
       this->price = pancake->price + 2;
       std::cout << this->name << " price: " << this->price << std::endl;
    }
};

class Potato : public PancakeDecorator {
public:
    explicit Potato(Pancake* pancake) : PancakeDecorator(pancake) {
        this->name  = pancake->name  + " + 土豆";
        this->price = pancake->price + 3;
        std::cout << this->name << " price: " << this->price << std::endl;
    }
};

EggPancake* eggPancake = new EggPancake();
Egg* egg = new Egg(eggPancake);
Potato* potato = new Potato(egg);
鸡蛋煎饼 + 鸡蛋 price: 5
鸡蛋煎饼 + 鸡蛋 + 土豆 price: 8

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文