设计模式之命令模式

一、命令模式中的角色与职责 设计模式之命令模式
文章图片

Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的 execute()等方法,通过这些方法可以调用请求接收者的相关操作
ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。在实现 execute()方法时,将调用接收者对象的相关操作(Action)
Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的 execute()方法,从而实现间接调用请求接收者的相关操作
Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理
二、适用场景 【设计模式之命令模式】(1) 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。请求调用者无须知道接收者的存在,也无须知道接收者是谁,接收者也无须关心何时被调用。
(2) 系统需要在不同的时间指定请求、将请求排队和执行请求。一个命令对象和请求的初始调用者可以有不同的生命期,换言之,最初的请求发出者可能已经不在了,而命令对象本身仍然是活动的,可以通过该命令对象去调用请求接收者,而无须关心请求调用者的存在
三、示例代码

#define _CRT_SECURE_NO_WARNINGS #include #include #include using namespace std; //协议处理类 class HandleClientProtocol{ public: //处理增加金币 void AddMoney(){ cout << "给玩家增加金币!" << endl; } //处理增加钻石 void AddDiamond(){ 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 AddDiamondCommand :public AbstractCommand{ public: AddDiamondCommand(HandleClientProtocol* protocol){ this->pProtocol = protocol; } virtual void handle(){ this->pProtocol->AddDiamond(); } 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 Serser{ 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 mCommands; }; void test(void){ HandleClientProtocol* protocol = new HandleClientProtocol; //客户端增加金币的请求 AbstractCommand* addmoney = new AddMoneyCommand(protocol); //客户端增加钻石的请求 AbstractCommand* adddiamond = new AddDiamondCommand(protocol); //客户端穿装备的请求 AbstractCommand* addequpment = new AddEquipmentCommand(protocol); //客户端升级请求 AbstractCommand* addlevel = new AddLevelCommand(protocol); Serser* server = new Serser; //将客户端请求加入到处理的队列中 server->addRequest(addmoney); server->addRequest(adddiamond); server->addRequest(addequpment); server->addRequest(addlevel); //服务器开始处理请求 server->startHandle(); }int main(void){ test(); return 0; }

    推荐阅读