文章目录
相关链接:
最终版: 《大话设计模式》C++实现:23 命令模式(三)抽象总结
1、场景说明
完善了 《大话设计模式》C++实现:23 命令模式(二)进阶版 中删除订单功能。
2、代码
2.1、结果
main.cpp
//松耦合方式2: 进阶版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* pBakeMuttonCmd1 = new CBakeMuttonCmd(boy);
ICommand* pBakeMuttonCmd2 = new CBakeMuttonCmd(boy);
ICommand* pBakeChickenWingCmd = new CBakeChickenWingCmd(boy);
ICommand* pBakeChickenWingCmd2 = new CBakeChickenWingCmd(boy);
CStock* pMuttonStock = new CStock(1, 5);
CStock* pChickenWingStock = new CStock(1, 6);
CWaiter* girl = new CWaiter(pMuttonStock, pChickenWingStock);
//开门营业,点餐
cout << "before order 羊肉串库存 = " << pMuttonStock->count() << endl;
cout << "before order 鸡翅库存 = " << pChickenWingStock->count() << endl;
girl->order(pBakeMuttonCmd);
girl->order(pBakeMuttonCmd1);
girl->order(pBakeMuttonCmd2);
girl->order(pBakeChickenWingCmd);
girl->cancelOrder(pBakeMuttonCmd1);//删除订单还有点问题,先屏蔽
girl->cancelOrder(pBakeMuttonCmd2);//删除订单还有点问题,先屏蔽
girl->order(pBakeChickenWingCmd2);
//通知
girl->notify();
cout << "after order 羊肉串库存 = " << pMuttonStock->count() << endl;
cout << "after order 鸡翅库存 = " << pChickenWingStock->count() << endl;
//析构
delete boy;
delete pBakeMuttonCmd;
delete pBakeMuttonCmd1;
delete pBakeMuttonCmd2;
delete pBakeChickenWingCmd;
delete pMuttonStock;
delete pChickenWingStock;
delete girl;
boy = nullptr;
pBakeMuttonCmd = nullptr;
pBakeMuttonCmd1 = nullptr;
pBakeMuttonCmd2 = nullptr;
pBakeChickenWingCmd = nullptr;
pMuttonStock = nullptr;
pChickenWingStock = nullptr;
girl = nullptr;
boy = nullptr;
}
int main()
{
test2();
system("pause");
return 0;
}
2.2、代码
2.2.1 Waiter.h
#pragma once
#include "ICommand.h"
#include "Stock.h"
#include <List>
#include <iostream>
#include <cstdio>
#include <ctime>
using namespace std;
/* 服务员类 */
//服务员需要知道库存,后续将库存从服务员类中剥离出来,搞个后勤管理员,让后勤管理员,服务员通过后勤得知库存量。
class CWaiter
{
public:
CWaiter(CStock* pMuttonStock, CStock* pChickenWingStock);
//点单
void order(ICommand* pCmd);
//取消点菜
void cancelOrder(ICommand* pCmd);
//通知后厨
void notify();
private:
list<ICommand* > m_lCmds;
CStock* m_pMuttonStock{ nullptr };//羊肉串库存
CStock* m_pChickenWingStock{ nullptr };//鸡翅库存
};
//获取当前时间
string cutTime();
CWaiter::CWaiter(CStock* pMuttonStock, CStock* pChickenWingStock)
:m_pMuttonStock(pMuttonStock), m_pChickenWingStock(pChickenWingStock)
{
}
void CWaiter::order(ICommand* pCmd)
{
m_lCmds.push_back(pCmd);
//to do: 及时得到库存,当某一个菜没有了,及时告知食客,修改订单
cout << "增加订单:" << pCmd->cmdName() << "\t时间:" << cutTime() << endl;
if (pCmd->cmdName() == "烤羊肉串")
{
if (m_pMuttonStock->count() > 0)
{
m_pMuttonStock->setCount(m_pMuttonStock->count() - 1);
}
else if (m_pMuttonStock->count() == 0)
{
cout << "顾客,今日羊肉串已售完,请取消订单或购买其他菜品~~" << endl;
m_lCmds.pop_back();
return;
}
}
else if (pCmd->cmdName() == "烤鸡翅")
{
if (m_pChickenWingStock->count() > 0)
{
m_pChickenWingStock->setCount(m_pChickenWingStock->count() - 1);
}
else if (m_pChickenWingStock->count() == 0)
{
cout << "顾客,今日鸡翅已售完,请取消订单或购买其他菜品~~" << endl;
m_lCmds.pop_back();
return;
}
}
}
void CWaiter::cancelOrder(ICommand* pCmd)
{
m_lCmds.remove(pCmd);
cout << "删除订单:" << pCmd->cmdName() << "\t时间:" << cutTime() << endl;
if (pCmd->cmdName() == "烤羊肉")
{
m_pMuttonStock->setCount(m_pMuttonStock->count() + 1);
}
else if (pCmd->cmdName() == "拷鸡翅")
{
m_pChickenWingStock->setCount(m_pMuttonStock->count() + 1);
}
}
//全部通知一遍
void CWaiter::notify()
{
cout << "有效订单如下:" << endl;
for each (auto pCmd in m_lCmds)
{
pCmd->exec();
}
}
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;
}
2.2.2、Stock.h
新增库存类,记录每种菜品的剩余库存
#pragma once
/* 库存类 */
class CStock
{
public:
CStock() :n(0), price(0.0) {}
~CStock() {}
CStock(const int& _n, const double& _price) : n(_n), price(_price) {}
int count() { return n; }
double getPrice() { return price; }
void setCount(const int& _n) { n = _n; }
void setPrice(const double& _prince) { price = _prince; }
protected:
int n;
double price;
};
2.2.3、Barbecuer.h
同 《大话设计模式》C++实现:23 命令模式(二)进阶版 的 2.2.2 Barbecuer.h
2.2.4、ICommand.h
同 《大话设计模式》C++实现:23 命令模式(二)进阶版 的 2.2.3 ICommand.h
2.2.5、BakeMuttonCmd.h
同 《大话设计模式》C++实现:23 命令模式(二)进阶版 的 2.2.4 BakeMuttonCmd.h
2.2.6、BakeChickenWingCmd.h
同 《大话设计模式》C++实现:23 命令模式(二)进阶版 的 2.2.5 BakeChickenWingCmd.h
命令模式相关链接:
《大话设计模式》C++实现:23 命令模式(一)基础版
《大话设计模式》C++实现:23 命令模式(二)进阶版
《大话设计模式》C++实现:23 命令模式(三)抽象总结