天天看点

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

文章目录

    • 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、结果

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

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 命令模式(三)抽象总结

继续阅读