将请求(行为)封装成对象,从而更加灵活的使用,比如对行为的记录、撤销、重做等,命令模式将组件的行为和组件本身解耦了。
command的模式和c++的仿函数很像,command模式以“接口-实现”来定义接口规范,更加严格,但是虚函数会有性能损失,是运行时绑定。C++的仿函数是以函数签名来定义行为规范,更加灵活,性能也更高,运用了模板(自动推导类型),是编译时绑定。
本质都是将行为对象化。
#pragma once
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
class command_base {
public:
virtual void excute()=0;
};
template<typename T>
class simple_command1 :public command_base<T> {
public:
virtual void excute() {
cout << "执行简单命令1" << endl;
}
};
template<typename T>
class simple_command2 :public command_base<T> {
public:
virtual void excute() {
cout << "执行简单命令2" << endl;
}
};
template<typename T>
class multy_command :public command_base<T> {
public:
virtual void excute() {
for (command_base<T>* i : command_vector) {
i->excute();
}
}
virtual void add_command(command_base<T>* Com) {
command_vector.push_back(Com);
}
virtual void pop_command(command_base<T>* Com) {
command_vector.pop_back();
}
protected:
vector<command_base<T>*> command_vector;
};
测试接口
//测试command模式
cout << "测试command模式" << endl;
command_base<bool>* com1 = new simple_command1<bool>;
command_base<bool>* com2 = new simple_command2<bool>;
multy_command<bool>* com3 = new multy_command<bool>;
com3->add_command(com1);
com3->add_command(com2);
com1->excute();
com2->excute();
cout << "执行一个复合命令" << endl;
com3->excute();