文章目录
-
- 1、场景说明
- 2、代码
-
- 2.1、结果
- 2.2、代码
-
- 2.2.1 Waiter.h
- 2.2.2 Barbecuer.h
- 2.2.3 ICommand.h
- 2.2.4 BakeMuttonCmd.h
- 2.2.5 BakeChickenWingCmd.h
1、场景说明
相较基础版:《大话设计模式》C++实现:23 命令模式(一)基础版:
增加了时间、加订单,删订单(只留了接口)、一次通知全部的菜单的功能。
《大话设计模式》C++实现:23 命令模式(二)进阶版2 完善了删订单功能~~
2、代码
2.1、结果
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnL3MDO4ATNyAjMwMTOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
main.cpp
//松耦合方式2: 进阶版
#include "ICommand.h"
#include "BakeMuttonCmd.h"
#include "BakeChickenWingCmd.h"
#include "Waiter.h"
void test2()
{
CBarbecuer* boy = new CBarbecuer();
ICommand* pBakeMuttonCmd = new CBakeMuttonCmd(boy);
ICommand* pBakeChickenWingCmd = new CBakeChickenWingCmd(boy);
CWaiter* girl = new CWaiter();
//开门营业,点餐
girl->order(pBakeMuttonCmd);
girl->order(pBakeMuttonCmd);
girl->order(pBakeChickenWingCmd);
//girl->cancelOrder(pBakeMuttonCmd);//删除订单还有点问题,先屏蔽
//通知
girl->notify();
//析构
delete boy;
delete pBakeMuttonCmd;
delete pBakeChickenWingCmd;
delete girl;
boy = nullptr;
pBakeMuttonCmd = nullptr;
pBakeChickenWingCmd = nullptr;
girl = nullptr;
}
int main()
{
test2();
system("pause");
return 0;
}
2.2、代码
2.2.1 Waiter.h
#pragma once
#include "ICommand.h"
#include <List>
#include <iostream>
#include <cstdio>
#include <ctime>
using namespace std;
class CWaiter
{
public:
//点单
void order(ICommand* pCmd);
//取消点菜,还有点问题,后期维护
void cancelOrder(ICommand* pCmd);
//通知后厨
void notify();
private:
list<ICommand* > m_lCmds;
};
string cutTime()
{
struct tm t; // tm结构指针
time_t now; // 声明time_t类型变量
time(&now); // 获取系统日期和时间
localtime_s(&t, &now); // 获取当地日期和时间
char szTmp[20] = "\0";
sprintf_s(szTmp, 20, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec); // 产生"123"
string szResult(szTmp);
return szResult;
}
void CWaiter::order(ICommand* pCmd)
{
m_lCmds.push_back(pCmd);
cout << "增加订单:" << pCmd->cmdName() << "\t时间:" << cutTime() << endl;
//to do: 如何及时得到库存,当某一个菜没有了,及时告知食客,修改订单
}
void CWaiter::cancelOrder(ICommand* pCmd)
{
m_lCmds.remove(pCmd);
cout << "删除订单:" << pCmd->cmdName() << "\t时间:" << cutTime() << endl;
}
//全部通知一遍
void CWaiter::notify()
{
for each (auto pCmd in m_lCmds)
{
pCmd->exec();
}
}
2.2.2 Barbecuer.h
(同《大话设计模式》C++实现:23 命令模式(一)基础版的Barbecuer.h)
2.2.3 ICommand.h
#pragma once
#include "Barbecuer.h"
#include <string>
using namespace std;
class ICommand
{
public:
ICommand(CBarbecuer* pBarbecuer = nullptr);
~ICommand();
//执行命令(做菜)
virtual void exec() = 0;
//命令名称(菜名)
virtual string cmdName() = 0;
protected:
//命令接受者(烤串人)
CBarbecuer* m_pReceiver{ nullptr };
};
ICommand::ICommand(CBarbecuer* pBarbecuer)
{
this->m_pReceiver = pBarbecuer;
}
ICommand::~ICommand()
{
m_pReceiver = nullptr;
}
2.2.4 BakeMuttonCmd.h
#pragma once
#include "ICommand.h"
class CBakeMuttonCmd :
public ICommand
{
public:
CBakeMuttonCmd(CBarbecuer* pBarbecuer = nullptr);
virtual void exec() override;
virtual string cmdName() override;
};
CBakeMuttonCmd::CBakeMuttonCmd(CBarbecuer* pBarbecuer /*= nullptr*/)
:ICommand(pBarbecuer)
{
}
void CBakeMuttonCmd::exec()
{
m_pReceiver->BakeMutton();//真正的妙处在这里啊,执行时,命令让烤串人去烤串
}
std::string CBakeMuttonCmd::cmdName()
{
return "烤羊肉串";
}
2.2.5 BakeChickenWingCmd.h
#pragma once
#include "ICommand.h"
class CBakeChickenWingCmd :
public ICommand
{
public:
CBakeChickenWingCmd(CBarbecuer* pBarbecuer = nullptr);
virtual void exec() override;
virtual string cmdName() override;
};
CBakeChickenWingCmd::CBakeChickenWingCmd(CBarbecuer* pBarbecuer /*= nullptr*/)
:ICommand(pBarbecuer)
{
}
void CBakeChickenWingCmd::exec()
{
m_pReceiver->BakeChickenWing();
}
std::string CBakeChickenWingCmd::cmdName()
{
return "烤鸡翅";
}
此为《大话设计模式》学习心得系列 P240~~
命令模式相关链接:
《大话设计模式》C++实现:23 命令模式(一)基础版
《大话设计模式》C++实现:23 命令模式(二)进阶版2
《大话设计模式》C++实现:23 命令模式(三)抽象总结