命令模式是一种行为型设计模式,它将请求封装成对象,从而允许你使用不同的请求、队列或者日志请求来参数化其他对象。这种模式的核心在于将请求的发送者和接收者解耦。
下面是一个使用 C++ 实现命令模式的示例代码:
#include <iostream>
#include <vector>
// 定义命令接口
class Command {
public:
virtual ~Command() {
}
virtual void Execute() = 0;
};
// 具体命令类:打印命令
class PrintCommand : public Command {
public:
void Execute() override {
std::cout << "Hello, world!" << std::endl;
}
};
// 具体命令类:加法命令
class AddCommand : public Command {
public:
AddCommand(int a, int b) : a_(a), b_(b) {
}
void Execute() override {
std::cout << a_ << " + " << b_ << " = " << a_ + b_ << std::endl;
}
private:
int a_;
int b_;
};
// 命令调用者
class Invoker {
public:
void SetCommand(Command* cmd) {
cmd_ = cmd;
}
void ExecuteCommand() {
if (cmd_) {
cmd_->Execute();
}
}
private:
Command* cmd_;
};
int main() {
// 创建命令
Command* print_cmd = new PrintCommand();
Command* add_cmd = new AddCommand(1, 2);
// 创建命令调用者
Invoker invoker;
// 设置命令并执行
invoker.SetCommand(print_cmd);
invoker.ExecuteCommand();
invoker.SetCommand(add_cmd);
invoker.ExecuteCommand();
// 释放内存
delete print_cmd;
delete add_cmd;
return 0;
}
在上面的代码中,我们定义了一个 Command 接口,其中包含了一个 Execute() 纯虚函数。PrintCommand 和 AddCommand 是具体的命令类,它们分别实现了 Execute() 函数,以完成具体的命令操作。
Invoker 类是命令调用者,它有一个 SetCommand() 函数用于设置命令,以及一个 ExecuteCommand() 函数用于执行命令。
在 main() 函数中,我们首先创建了两个具体的命令对象,然后创建了一个命令调用者对象。接着,我们将两个命令对象分别设置给命令调用者,并执行命令。最后,我们释放了命令对象的内存。
命令模式的优点在于它使得请求发送者和接收者之间解耦,从而可以更加灵活地设计系统。此外,命令对象可以方便地组合成复合命令,从而实现更加复杂的功能。