命令模式(Command)的目标是将一个请求封装成一个对象,因此可以参数化多个客户的不同请求,将请求排除,记录请求日志,并支持撤消操作。 结构图如下:其实现思想是将一个请求封装到一个类中(Command),再提供接收对象(Receiver),最后Command命令由Invoker调用。 以一个电灯开关为例,命令的执行、不执行相对于开关的打开、关闭操作,由开关发出命令,电灯接收命令,结构图如下:
#include <iostream> using namespace std; class Light { public: Light(){}; virtual ~Light(){}; void TurnOn() { cout << "电灯打开了" << endl; } void TurnOff() { cout << "电灯关闭了" << endl; } }; class Command { public: virtual ~Command(){} virtual void Execute() = 0; virtual void UnExecute() = 0; protected: Command(){} }; class LightCommand : public Command { public: LightCommand(Light * pLight) { m_pLight = pLight; } virtual ~LightCommand() { if(m_pLight != NULL) { delete m_pLight; m_pLight = NULL; } } void Execute() { m_pLight->TurnOn(); } void UnExecute() { m_pLight->TurnOff(); } private: Light* m_pLight; }; class Switch { public: Switch(Command* pCommand) { m_pCommand = pCommand; } virtual ~Switch(){} void Open() { m_pCommand->Execute(); } void Close() { m_pCommand->UnExecute(); } private: Command* m_pCommand; }; int main(int argc, char* argv[]) { Light* pLight = new Light; Command* pCommand = new LightCommand(pLight); Switch* pSwitch = new Switch(pCommand); pSwitch->Open(); pSwitch->Close(); return 0; }