详解设计模式中的Command命令模式及相关C++实现
什么是Command模式?
Command模式是一种行为型设计模式,它将请求封装成一个对象,从而使您可以使用不同的请求、队列或日志请求参数化客户端对象。该模式还支持撤销操作。
Command模式的角色
Command模式涉及以下四个角色:
-
Receiver: 程序执行实际操作的对象(比如照明系统、音响设备等)。
-
Command:把调用指令封装成每个命令对象中的对象。
-
Invoker:给出一个适当的命令,然后按照客户端的要求执行命令。
-
Client:实际上是一个使用Invoker类的对象。
Command模式的实现
在C++语言中,可以通过将Command实现为抽象基类,并调用实际操作的虚函数来实现这种模式。
下面是一个使用Command模式控制灯光的示例:
实现步骤
1.定义包含"switch_on"和"switch_off" 函数的Receiver类。
class Receiver {
public:
void switch_on() {
cout << "Light switched on!" << endl;
}
void switch_off() {
cout << "Light switched off!" << endl;
}
};
2.定义Command类,使用其中的"execute"函数来调用实际操作。
class Command {
public:
virtual void execute() = 0;
};
3.定义两个具体的Command实现,用于打开和关闭灯光。
class Switch_on_Command: public Command {
public:
Switch_on_Command(Receiver *r) {
receiver = r;
}
void execute() {
receiver->switch_on();
}
private:
Receiver *receiver;
};
class Switch_off_Command: public Command {
public:
Switch_off_Command(Receiver *r) {
receiver = r;
}
void execute() {
receiver->switch_off();
}
private:
Receiver *receiver;
};
4.定义Invoker类,它可以包含一个Command对象,并调用其中的"execute"函数。
class Invoker {
public:
Invoker(Command *c) {
cmd = c;
}
void execute() {
cmd->execute();
}
private:
Command *cmd;
};
5.定义Client类,它将Receiver、Command和Invoker组合在一起。
int main() {
Receiver *r = new Receiver();
Switch_on_Command *switch_on_command = new Switch_on_Command(r);
Switch_off_Command *switch_off_command = new Switch_off_Command(r);
Invoker *invoker_for_switch_on_command = new Invoker(switch_on_command);
Invoker *invoker_for_switch_off_command = new Invoker(switch_off_command);
invoker_for_switch_on_command->execute();
invoker_for_switch_off_command->execute();
return 0;
}
运行程序后,将输出以下内容:
Light switched on!
Light switched off!
另一个Command模式的示例
下面是一个更有趣的示例,该示例使用Command模式在电视机上切换频道:
实现步骤
1.定义包含"channel_up"和"channel_down" 函数的电视机类。
class TV {
public:
void channel_up() {
cout << "Channel up!" << endl;
}
void channel_down() {
cout << "Channel down!" << endl;
}
};
2.定义Command类,使用其中的"execute"函数来调用实际操作。
class Command {
public:
virtual void execute() = 0;
};
3.定义两个具体的Command实现,用于打开和关闭灯光。
class Channel_up_Command: public Command {
public:
Channel_up_Command(TV *tv) {
tv_object = tv;
}
void execute() {
tv_object->channel_up();
}
private:
TV *tv_object;
};
class Channel_down_Command: public Command {
public:
Channel_down_Command(TV *tv) {
tv_object = tv;
}
void execute() {
tv_object->channel_down();
}
private:
TV *tv_object;
};
4.定义Invoker类,它可以包含一个Command对象,并调用其中的"execute"函数。
class Invoker {
public:
Invoker(Command *c) {
cmd = c;
}
void execute() {
cmd->execute();
}
private:
Command *cmd;
};
5.定义Client类,它将TV、Command和Invoker组合在一起。
int main() {
TV *tv = new TV();
Channel_up_Command *channel_up_command = new Channel_up_Command(tv);
Channel_down_Command *channel_down_command = new Channel_down_Command(tv);
Invoker *invoker_for_channel_up_command = new Invoker(channel_up_command);
Invoker *invoker_for_channel_down_command = new Invoker(channel_down_command);
invoker_for_channel_up_command->execute();
invoker_for_channel_down_command->execute();
return 0;
}
运行程序后,将输出以下内容:
Channel up!
Channel down!
总结
Command模式提供了一种旨在将请求封装成一个对象的方法,从而支持日志记录、队列和撤销操作。它优雅地解决了解决了用obj.method()的实现方式,将程序中的行为抽象出来。Command模式几乎是任何面向对象编程语言的必备技能,可以大大提高您的代码能力。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解设计模式中的Command命令模式及相关C++实现 - Python技术站