《大话设计模式》C++实现:23 命令模式(二)进阶版2

    科技2022-07-13  122

    文章目录

    1、场景说明2、代码2.1、结果2.2、代码2.2.1 Waiter.h2.2.2、Stock.h2.2.3、Barbecuer.h2.2.4、ICommand.h2.2.5、BakeMuttonCmd.h2.2.6、BakeChickenWingCmd.h 相关链接: 最终版: 《大话设计模式》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 命令模式(三)抽象总结

    Processed: 0.037, SQL: 8