1、命令模式的提出
在软件开发过程中,“行为请求者”和“行为实现者”通常呈现一种“紧耦合”,如果行为的实现经常变化,则不利于代码的维护。命令模式可以将行为的请求者和行为的实现者进行解耦。具体流程是将行为请求者封装成一个对象,将行为实现者抽象成一个类。
2、需求描述
有2两种不同的行为,两种不同行为分别对应不同的操作。设计一个代码,可以实现不同的行为对应不同的处理行为。
3、功能实现
(1)UML图如下:
(2)代码实现如下:
#include <iostream>
#include <vector>
// 命令接口
class Command {
public:
Command(std::string cmd):m_strCmd(cmd){};
virtual ~Command() {}
virtual void execute() = 0;
std::string& getCmd(){return m_strCmd;};
private:
std::string m_strCmd;
};
class ConcreteCommand1 : public Command {
public:
ConcreteCommand1(std::string str):Command(str){};
void execute() override {
std::cout << "ConcreteCommand1: " << getCmd() << std::endl;
// todo something...
}
};
class ConcreteCommand2 : public Command {
public:
ConcreteCommand2(std::string str):Command(str){};
void execute() override {
std::cout << "ConcreteCommand2: " << getCmd() << std::endl;
// todo something...
}
};
// 命令请求者
class Requester {
private:
std::vector<Command*> m_vecCommands;
public:
void aadCommand(Command* cmd) {
m_vecCommands.emplace_back(cmd);
}
void executeCommand() {
for(auto& it:m_vecCommands)
{
it->execute();
}
}
};
class Client
{
public:
void doWork()
{
Requester request;
Command* command1 = new ConcreteCommand1("Command1");
Command* command2 = new ConcreteCommand2("Command2");
request.aadCommand(command1);
request.aadCommand(command2);
request.executeCommand();
delete command1;
delete command2;
command1 = nullptr;
command2 = nullptr;
};
}
int main() {
Client obj;
obj.doWork();
return 0;
}
程序运行结果如下: