命令模式

来源:互联网 发布:淘宝女士春装 编辑:程序博客网 时间:2024/06/03 19:36

命令模式

将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队而或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。


客户端和服务器端进行通信,基于某种协议。所以服务器端要包含很多种协议,和不同客户端进行通信。

#include<iostream>#include<queue>#include<Windows.h>using namespace std;//协议处理类,将各种协议封装在这个类中class HandleClientProtocol{public://处理增加金币void AddMoney(){cout<<"给玩家增加金币!"<<endl;}//处理增加钻石void AddDiamod(){cout<<"给玩家增加钻石!"<<endl;}//处理玩家装备void AddEquipment(){cout<<"给玩家穿装备!"<<endl;}//处理玩家升级void AddLevel(){cout<<"给玩家升级!"<<endl;}};//命令接口class AbstractCommand{public:virtual void handle() = 0;//处理客户端请求的接口};//下面将上述协议封装为对象//处理增加金币请求class AddMoneyCommand : public AbstractCommand{public:AddMoneyCommand(HandleClientProtocol* protocol){this->pProtocol = protocol;}virtual void handle(){this->pProtocol->AddMoney();}public:HandleClientProtocol* pProtocol;};//处理增加钻石请求class AddDiamodCommand : public AbstractCommand{public:AddDiamodCommand(HandleClientProtocol* protocol){this->pProtocol = protocol;}virtual void handle(){this->pProtocol->AddDiamod();}public:HandleClientProtocol* pProtocol;};//处理玩家装备请求class AddEquipmentCommand : public AbstractCommand{public:AddEquipmentCommand(HandleClientProtocol* protocol){this->pProtocol = protocol;}virtual void handle(){this->pProtocol->AddEquipment();}public:HandleClientProtocol* pProtocol;};//处理玩家升级请求class AddLevelCommand : public AbstractCommand{public:AddLevelCommand(HandleClientProtocol* protocol){this->pProtocol = protocol;}virtual void handle(){this->pProtocol->AddLevel();}public:HandleClientProtocol* pProtocol;};//服务器程序,考虑到上千玩家同时发送请求,所以进行排队,将请求处理函数丢到队列中class Server{public:void addRequest(AbstractCommand* command){mCommands.push(command);}void startHandle(){while(!mCommands.empty()){Sleep(2000);AbstractCommand* command = mCommands.front();command->handle();mCommands.pop();}}public:queue<AbstractCommand*> mCommands;//把客户端发送过来的协议都放到这个队列中,让服务器一个个处理};void test01(){HandleClientProtocol* protocol = new HandleClientProtocol;//客户端增加金币的请求AbstractCommand* addmoney = new AddMoneyCommand(protocol);//客户端增加钻石的请求AbstractCommand* adddiamod = new AddDiamodCommand(protocol);//客户端穿装备的请求AbstractCommand* addequipment = new AddEquipmentCommand(protocol);//客户端升级的请求AbstractCommand* addlevel = new AddLevelCommand(protocol);Server* server = new Server;//将客户端的请求加入到请求队列中server->addRequest(addmoney);server->addRequest(adddiamod);server->addRequest(addequipment);server->addRequest(addlevel);//服务器开始处理请求server->startHandle();delete addlevel;delete addequipment;delete adddiamod;delete addmoney;delete protocol;}int main(void){test01();system("pause");return 0;}