IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 嵌入式Linux C++练习8——创建型模式 -> 正文阅读

[C++知识库]嵌入式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;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:10:21  更:2021-08-21 15:12:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 5:13:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计