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

该文章介绍了使用C++实现命令模式来改进点餐系统,包括服务员、库存管理、烧烤师傅等角色。通过命令模式,实现了点餐、取消点餐和通知后厨的功能,增强了系统的灵活性和可维护性。文章还展示了具体的代码实现,如`Waiter`、`Stock`、`ICommand`等类的定义。
摘要由CSDN通过智能技术生成


相关链接:
最终版: 《大话设计模式》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 命令模式(三)抽象总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值