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++知识库 -> c++ 命令模式 -> 正文阅读

[C++知识库]c++ 命令模式

范例一:

#include <iostream>
using namespace std;
class cook
{
public:
    void fish()
    {
        std::cout << "doing fish" << std::endl;
    }
    void meat()
    {
        std::cout << "doing meat" << std::endl;
    }
};

class command
{
public:
    command(cook* p_cook)
    {
        m_cook = p_cook;
    }
    ~command(){}
public:
    virtual void execute() = 0;
protected:
    cook* m_cook;
};


class dofish : public command
{
public:
    dofish(cook* p_cook) :command(p_cook){}
    ~dofish(){}
public:
    void execute()
    {
        m_cook->fish();
    }
};

class domeat : public command
{
public:
    domeat(cook* p_cook) :command(p_cook) {}
    ~domeat() {}
public:
    void execute()
    {
        m_cook->meat();
    }
};

int main()
{
    /*main函数里面的这段代码相当于是顾客自己去点菜的过程
    ,如果一个菜被点了10次,在现在这种情况下,我们需要
    new10次做鱼类或者肉类,,这会相当的麻烦,,这其实是相当于
    顾客要点菜时,直接把点菜的这个命令告诉了厨师,厨师不一定
    记得了那么多,我们接下来通过服务员类解决这个问题,
    其实也是我们说的命令模式*/
    cook mcook;
    command* p1 = new dofish(&mcook);
    p1->execute();

    command* p2 = new domeat(&mcook);
    p2->execute();

    delete p1;
    delete p2;
    return 0;
}

在这里插入图片描述
范例二:

#include <iostream>
#include <type_traits>
#include <boost/type_index.hpp>
using namespace std;

class cook
{
public:
    void fish()
    {
        std::cout << "doing fish" << std::endl;
    }
    void meat()
    {
        std::cout << "doing meat" << std::endl;
    }
};

class command
{
public:
    command(cook* p_cook)
    {
        m_cook = p_cook;
    }
    ~command(){}
public:
    virtual void execute() = 0;
protected:
    cook* m_cook;
};

class dofish : public command
{
public:
    dofish(cook* p_cook) :command(p_cook){}
    ~dofish(){}
public:
    void execute()
    {
        m_cook->fish();
    }
};

class domeat : public command
{
public:
    domeat(cook* p_cook) :command(p_cook) {}
    ~domeat() {}
public:
    void execute()
    {
        m_cook->meat();
    }
};


class waiter
{
public:
    void setcommand(command* pcommand)
    {
        p_command = pcommand;
    }
    void notify()
    {
        p_command->execute();
    }
public:
    command* p_command;
};


int main()
{
    cook mcook;
    waiter pwaiter;

    command* p1 = new dofish(&mcook);
    pwaiter.setcommand(p1);
    pwaiter.notify();

    command* p2 = new domeat(&mcook);
    pwaiter.setcommand(p2);
    pwaiter.notify();

    delete p1;
    delete p2;
    return 0;
}

在上面的例程当中,我们增加了一个服务员的类,
通过服务员接收顾客下发的命令,,然后在通知厨师开始做菜,相比于第一种方式有了一点改观,但是,如果顾客要下单一百个菜,服务员就要通知100次???感觉有点不太行,我们要对服务员这个类做下修改。

范例三:

#include <iostream>
#include <list>
#include <type_traits>
#include <boost/type_index.hpp>
using namespace std;
class cook
{
public:
    void fish()
    {
        std::cout << "doing fish" << std::endl;
    }
    void meat()
    {
        std::cout << "doing meat" << std::endl;
    }
};

class command
{
public:
    command(cook* p_cook)
    {
        m_cook = p_cook;
    }
    ~command(){}
public:
    virtual void execute() = 0;
protected:
    cook* m_cook;
};

class dofish : public command
{
public:
    dofish(cook* p_cook) :command(p_cook){}
    ~dofish(){}
public:
    void execute()
    {
        m_cook->fish();
    }
};

class domeat : public command
{
public:
    domeat(cook* p_cook) :command(p_cook) {}
    ~domeat() {}
public:
    void execute()
    {
        m_cook->meat();
    }
};

class waiter
{
public:
    void setcommand(command* pcommand)
    {
        m_commandlist.push_back(pcommand);
    }

    void Cancelcommand(command* pcommand)
    {
        m_commandlist.remove(pcommand);
    }

    void notify()
    {
        for (auto iter = m_commandlist.begin(); iter != m_commandlist.end(); iter++)
        {
            (*iter)->execute();
        }
    }
public:
    std::list<command*> m_commandlist;
};

int main()
{
    cook mcook;
    waiter pwaiter;
    command* p1 = new dofish(&mcook);
    command* p2 = new domeat(&mcook);

    pwaiter.setcommand(p1);
    pwaiter.setcommand(p2);

    pwaiter.notify();

    delete p1;
    delete p2;
    return 0;
}

终于可以达到我们的目的了。
其实上面就是命令模式的体现,我们接下来仔细谈下这个模式:

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:13:21  更:2022-03-15 22:17:36 
 
开发: 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年11日历 -2024/11/24 2:34:50-

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