嵌入式Linux C++练习8——创建型模式

1. 工厂方法实现计算器的四则运算

#include <iostream>
#include <memory>
using namespace std;

class cal //抽象产品类
{
    
    
public:
    float num1() {
    
     return a; }
    void num1(float x) {
    
     a = x; }
    float num2() {
    
     return b; }
    void num2(float x) {
    
     b = x; }

    virtual float result() = 0;

private:
    float a;
    float b;
};

class add : public cal //具体产品:加法操作
{
    
    
public:
    float result()
    {
    
    
        return num1() + num2();
    }
};

class sub : public cal //具体产品:减法操作
{
    
    
public:
    float result()
    {
    
    
        return num1() - num2();
    }
};

class mul : public cal //具体产品:乘法操作
{
    
    
public:
    float result()
    {
    
    
        return num1() * num2();
    }
};

class dev : public cal //具体产品:除法操作
{
    
    
public:
    float result()
    {
    
    
        if (num2() == 0)
        {
    
    
            cout << "除数为0!" << endl;
            return 0;
        }
        else
        {
    
    
            return num1() / num2();
        }
    }
};

class factory //抽象工厂
{
    
    
public:
    virtual shared_ptr<cal> getcal() = 0;
};

class addf : public factory //加法工厂
{
    
    
public:
    shared_ptr<cal> getcal()
    {
    
    
        return shared_ptr<cal>(new add());
    }
};

class subf : public factory //减法工厂
{
    
    
public:
    shared_ptr<cal> getcal()
    {
    
    
        return shared_ptr<cal>(new sub());
    }
};

class mulf : public factory //乘法工厂
{
    
    
public:
    shared_ptr<cal> getcal()
    {
    
    
        return shared_ptr<cal>(new mul());
    }
};

class devf : public factory //除法工厂
{
    
    
public:
    shared_ptr<cal> getcal()
    {
    
    
        return shared_ptr<cal>(new dev());
    }
};

int main()
{
    
    
    shared_ptr<factory> factory(new mulf);
    shared_ptr<cal> c = factory->getcal();

    c->num1(3);
    c->num2(4);

    cout << c->result() << endl;

    return 0;
}

2. 建造者模式实现造一栋普通房子和一栋别墅:门,墙,房顶,

#include <iostream>
using namespace std;

class house //房屋类
{
    
    
private:
    string m_house; //房型
    string m_door;  //门
    string m_wall;  //墙
    string m_roof;  //屋顶

public:
    void sethouse(string house) {
    
     m_house = house; } //选择房子
    void setdoor(string door) {
    
     m_door = door; }     //选择门
    void setwall(string wall) {
    
     m_wall = wall; }     //选择墙
    void setroof(string roof) {
    
     m_roof = roof; }     //选择房顶

    void display()
    {
    
    
        cout << m_house << "," << m_door << "," << m_wall << "," << m_roof << endl;
    }
};

class Assemble //房屋组装类:抽象类
{
    
    
public:
    virtual void assemblehouse() = 0; //修建房子
    virtual void assembledoor() = 0;  //修建门
    virtual void assemblewall() = 0;  //修建墙
    virtual void assembleroof() = 0;  //修建屋顶
    virtual house *gethouse() = 0;    //得到一栋房子
};

class Assemblecommon : public Assemble //修建一栋普通房子
{
    
    
private:
    house *h; //普通房子

public:
    Assemblecommon() {
    
     h = new house; } //创建一栋房子的对象
    void assemblehouse() {
    
     h->sethouse("普通房子"); }
    void assembledoor() {
    
     h->setdoor("机械门"); }
    void assemblewall() {
    
     h->setwall("石灰墙"); }
    void assembleroof() {
    
     h->setroof("瓷砖瓦"); }

    house *gethouse()
    {
    
    
        return h;
    }
};

class Assemblecottage : public Assemble //修建一栋别墅
{
    
    
private:
    house *h;

public:
    Assemblecottage() {
    
     h = new house; } //创建一栋房子的对象
    void assemblehouse() {
    
     h->sethouse("别墅"); }
    void assembledoor() {
    
     h->setdoor("密码门"); }
    void assemblewall() {
    
     h->setwall("大理石墙"); }
    void assembleroof() {
    
     h->setroof("琉璃瓦"); }

    house *gethouse()
    {
    
    
        return h;
    }
};

class constructor
{
    
    
public:
    constructor(Assemble *assemble)
    {
    
    
        m_Assemble = assemble;
    }

    void assemblehouse() //建造者修建房子
    {
    
    
        m_Assemble->assemblehouse();
        m_Assemble->assembledoor();
        m_Assemble->assemblewall();
        m_Assemble->assembleroof();
    }

    house *gethouse() //建造者修建房子最终返回房子
    {
    
    
        return m_Assemble->gethouse();
    }

private:
    Assemble *m_Assemble; //建房流程对象
};

int main()
{
    
    
    Assemble *a = new Assemblecommon;    //订单:造一辆国产车
    constructor *c = new constructor(a); //创建一个建造者,把订单给他
    c->assemblehouse();                  //建造汽车
    c->gethouse()->display();            //展示造好的汽车
    delete c;
    delete a;

    a = new Assemblecottage;  //订单:造一辆国产车
    c = new constructor(a);   //创建一个建造者,把订单给他
    c->assemblehouse();       //建造汽车
    c->gethouse()->display(); //展示造好的汽车
    delete c;
    delete a;

    return 0;
}

3. 包装模式实现一个手抓饼材料的添加代码,继承输出:培根肉松榨菜老干妈手抓饼

#include <iostream>
using namespace std;

class food //抽象食物类
{
    
    
public:
    virtual void show() = 0;
};

class SZB : public food //具体食物手抓饼
{
    
    
public:
    SZB() {
    
    }
    SZB(string n) : name(n) {
    
    }
    void show()
    {
    
    
        cout << name << endl;
    }

private:
    string name;
};

class decorator : public food //装饰类:对手抓饼进行装饰
{
    
    
public:
    void decorate(food *f)
    {
    
    
        this->f = f;
    }

    void show()
    {
    
    
        if (f != NULL)
        {
    
    
            f->show(); //添加装饰品
        }
    }

protected:
    food *f;
};

class bacon : public decorator //培根:具体装饰物
{
    
    
public:
    void show()
    {
    
    
        cout << "培根";
        decorator::show();
    }
};

class floss : public decorator //肉松:具体装饰物
{
    
    
public:
    void show()
    {
    
    
        cout << "肉松";
        decorator::show();
    }
};

class zhacai : public decorator //榨菜:具体装饰物
{
    
    
public:
    void show()
    {
    
    
        cout << "榨菜";
        decorator::show();
    }
};

class laoganma : public decorator //老干妈:具体装饰物
{
    
    
public:
    void show()
    {
    
    
        cout << "老干妈";
        decorator::show();
    }
};

int main()
{
    
    
    food *f = new SZB("手抓饼");
    bacon *ba = new bacon;       //装饰品:培根
    floss *fl = new floss;       //装饰品:肉松
    zhacai *zh = new zhacai;     //装饰品:榨菜
    laoganma *la = new laoganma; //装饰品:老干妈

    //培根肉松榨菜老干妈手抓饼
    la->decorate(f);
    zh->decorate(la);
    fl->decorate(zh);
    ba->decorate(fl);
    ba->show();

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45792897/article/details/119830216