命令模式是一种行为型模式,将一个请求封装成一个对象,从而可以用不同的请求对象进行参数化
-
降低命令请求端和接收端的耦合度
-
新的命令只需要封装成相应的对象,就可以添加到系统中,可扩展性好
- 命令比较多的情况下,会导致创建过多的命令类
- 客户端有多个请求协议的情况下,可以将协议当做命令

#include <iostream>
#include <queue>
// 炒菜
class Cooking{
public:
void cookPork(){
std::cout << "炒猪肉" << std::endl;
}
void cookBeef(){
std::cout << "炒牛肉" << std::endl;
}
void cookLamb(){
std::cout << "炒羊肉" << std::endl;
}
};
// 命令接口,菜单
class AbstractCommand{
public:
virtual void handle() = 0;
};
class cookPorkCommand : public AbstractCommand{
public:
cookPorkCommand(Cooking* c){
this->c = c;
}
virtual void handle(){
this->c->cookPork();
}
private:
Cooking* c;
};
class cookBeefCommand: public AbstractCommand{
public:
cookBeefCommand(Cooking* c){
this->c = c;
}
virtual void handle(){
this->c->cookBeef();
}
private:
Cooking* c;
};
class cookLambCommand: public AbstractCommand{
public:
cookLambCommand(Cooking* c){
this->c = c;
}
virtual void handle(){
this->c->cookLamb();
}
private:
Cooking* c;
};
// 厨师
class Cooker{
public:
void addOrder(AbstractCommand* command){
orders.push(command);
}
void cookeFood(){
while(!orders.empty()){
AbstractCommand* command = orders.front();
command->handle();
orders.pop();
}
}
public:
std::queue<AbstractCommand*> orders;
};
int main(){
Cooking* c = new Cooking();
cookPorkCommand* pork = new cookPorkCommand(c);
cookPorkCommand* beef = new cookPorkCommand(c);
cookLambCommand* lamb = new cookLambCommand(c);
Cooker* cooker = new Cooker();
cooker->addOrder(pork);
cooker->addOrder(beef);
cooker->addOrder(lamb);
cooker->cookeFood();
return 0;
}