命令模式:在接收者类中一般会对操作进行最基本的封装,命令类则通过对这些基本的操作进行二次封装;
优点:
1.命令的调用者与执行者分开,调用者只需知道命令类即可,使双方不必关心对方是如何操作的,耦合度要比把所有的操作都封装到一个类中要低的多;这也是命令模式的精髓所在;
2.耦合度低,加进新的命令类不影响其他的类,因此扩展命令类很容易。
扩展:
1.当一个命令需要多个接收者/执行者时,可以在命令内set多个接受者,完成通力合作的问题;
2. 结合责任链模式实现命令族解析任务;结合模板方法,减少Command子类的膨胀
缺点:
如果命令很多,使用命令模式,会比直接执行命令工作量多很多,尤其是只需要几行代码即可实现的命令很多时。
实例:
1.数据库中的事务;
2.只要认为是命令的地方。如 GUI 开发,按钮,DOS命令模拟,触发反馈机制的处理等;
#include <iostream>
#include <vector>
using namespace std;
class Barbecuer
{
public:
Barbecuer()
{
}
void bakeMutton()
{
cout << "bakeMutton" << endl;
}
void bakeChickenWing()
{
cout << "bakeChickenWing" << endl;
}
};
class Command
{
public:
Command(Barbecuer* barbecuer)
{
m_barbecuer = barbecuer;
}
virtual void executeCommand() = 0;
Barbecuer *m_barbecuer;
};
class BakeMuttonCommand : public Command
{
public:
BakeMuttonCommand(Barbecuer *barbecuer) : Command(barbecuer)
{
}
void executeCommand()
{
m_barbecuer->bakeMutton();
}
};
class BakeChickenWingCommand : public Command
{
public:
BakeChickenWingCommand(Barbecuer *barbecuer) : Command(barbecuer)
{
}
void executeCommand()
{
m_barbecuer->bakeChickenWing();
}
};
class Waiter
{
public:
Waiter()
{
}
void setCommand(Command* cmd)
{
m_command_vector.push_back(cmd);
}
void removeCommand(Command *cmd)
{
vector<Command*>::iterator it;
for(it = m_command_vector.begin(); it != m_command_vector.end(); it++)
{
if((*it) == cmd)
{
m_command_vector.erase(it);
break;
}
}
}
void notify()
{
vector<Command*>::iterator it;
for(it = m_command_vector.begin(); it != m_command_vector.end(); it++)
{
(*it)->executeCommand();
}
}
vector<Command*> m_command_vector;
};
int main()
{
Barbecuer *p_barbecuer = new Barbecuer;
Command *p_bakemutton = new BakeMuttonCommand(p_barbecuer);
Command *p_bakechicken = new BakeChickenWingCommand(p_barbecuer);
Waiter* p_waiter = new Waiter;
p_waiter->setCommand(p_bakemutton);
p_waiter->setCommand(p_bakechicken);
p_waiter->notify();
p_waiter->removeCommand(p_bakemutton);
p_waiter->notify();
return 0;
}