Qt C++设计模式——装饰模式

奶茶已经是现在年轻人必不可少的“养身”饮料,众所周知奶茶只是基本产品,可以加入龟苓膏、珍珠、柠檬片、果冻、养乐多等等原材料来形成不同的产品。那么对于一个奶茶店来说,每做一杯产品的价格该如何确定呢?这肯定是取决于使用材料的不同。

例如一杯纯奶茶,成本就是最少的,但是要是一杯烧仙草那么成本就相对更高。

对于奶茶店来说如果想使用一个系统来获取产品的价格,那么就适合使用装饰者模式。

这里的产品就是被装饰者,而材料就是装饰者。将不同的装饰者装饰到被装饰者上便得到不同的产品。同时每一个装饰者也是一个被装饰者。

装饰者模式——动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

代码如下:

#ifndef DECORATORPATTERN_H
#define DECORATORPATTERN_H

#include <stdlib.h>
#include <iostream>

using namespace std;

//基础抽象类
class Product
{
public:

    Product(){}
    ~Product(){}

    virtual double cost() = 0;//价格
};

//纯奶茶
class MilkTeam:public Product
{
public:
    MilkTeam(){

    }
    ~MilkTeam(){}

    double cost(){
        return 3;
    }
};


//烧仙草
class ShaoXianCao:public Product
{
public:
    ShaoXianCao(){

    }
    ~ShaoXianCao(){}

    double cost(){
        return 5;
    }
};

//柠檬养乐多
class NingMengYangLeDuo:public Product
{
public:
    NingMengYangLeDuo(){
    }
    ~NingMengYangLeDuo(){}

    double cost(){
        return 2.0;
    }
};

//装饰者抽象类,也要继承产品的基础类
class MaterialDecorator:public Product
{
public:

    MaterialDecorator(){}
    ~MaterialDecorator(){}

    virtual void getName() = 0;
};

//装饰者1——龟苓膏
class GuiLingGao:public MaterialDecorator
{
public:

    GuiLingGao(Product *p){
        this->product = p;//被装饰者
    }
    ~GuiLingGao(){}

    void getName(){
        cout<< "加入了龟苓膏"<<endl;
    }

    double cost(){
        getName();
        return 2.5 + product->cost();
    }

private:
    Product *product = nullptr;
};

//装饰者2——柠檬片
class NingMengPian:public MaterialDecorator
{
public:

    NingMengPian(Product *p){
        this->product = p;//被装饰者
    }
    ~NingMengPian(){}

    void getName(){
        cout<< "加入了柠檬片"<<endl;
    }

    double cost(){
        getName();
        return 0.2 + product->cost();
    }

private:
    Product *product = nullptr;
};

//装饰者3——养乐多
class YangLeDuo:public MaterialDecorator
{
public:

    YangLeDuo(Product *p){
        this->product = p;//被装饰者
    }
    ~YangLeDuo(){}

    void getName(){
        cout<< "加入了养乐多"<<endl;
    }

    double cost(){
        getName();
        return 5 + product->cost();
    }

private:
    Product *product = nullptr;
};


#endif // DECORATORPATTERN_H

main.cpp中调用:

Product *pMilkTeam = new MilkTeam;//顾客1 点了一杯纯奶茶
cout <<"纯奶茶价格:"<<pMilkTeam->cost() << endl;

Product *pShaoXianCao = new ShaoXianCao;//顾客2 点了一杯烧仙草
pShaoXianCao = new GuiLingGao(pShaoXianCao);//烧仙草需要加入龟苓膏
cout <<"烧仙草价格:"<<pShaoXianCao->cost()<<endl;

Product *pNingMengYangLeDuo = new NingMengYangLeDuo;//顾客3 点了一杯柠檬养乐多
pNingMengYangLeDuo = new NingMengPian(pNingMengYangLeDuo);//需要加入柠檬片
pNingMengYangLeDuo = new YangLeDuo(pNingMengYangLeDuo);//需要加入养乐多

cout <<"柠檬养乐多价格:"<<pNingMengYangLeDuo->cost() << endl;

结果:

发布了28 篇原创文章 · 获赞 4 · 访问量 7389

猜你喜欢

转载自blog.csdn.net/JuicyActiveGilbert/article/details/100031173