命令(command)模式的结构很简单,但是对于消除代码间的耦合,清理代码去有着重要的影响。从最直观的角度来看,命令模式就是一个函数对象:一个作为对象的函数。通过将函数封装为对象,就能够以参数的形式将其传递给其他函数或者对象,告诉它们在履行请求的过程中执行特定的操作。可以说,命令模式是携带行为信息的信使。一个简单的例子如下:
#include<iostream>
#include<vector>
using namespace std;
class Command
{
public:
virtual void execute()=0;
};
class Hello: public Command
{
public:
void execute(){cout<<"hello ";}
};
class World : public Command
{
public:
void execute(){cout<<"world!";}
};
class IAm:public Command
{
public:
void execute(){cout<<"I'm the command pattern!";}
};
class Macro
{
vector<Command *>commands;
public:
void add(Command *c){commands.push_back(c);}
void run()
{
vector<Command*>::iterator it=commands.begin();
while(it!=commands.end())
{
(*it++)->execute();
cout<<endl;
}
}
};
int main()
{
Macro macro;
macro.add(new Hello);
macro.add(new World);
macro.add(new IAm);
macro.run();
}
命令模式的主要特点是允许向一个函数或者对象传递一个想要的动作。上述例子提供了将一系列需要一起执行的动作集进行排队的方法。在这里,可以动态创建新的行为,某些事情通常只能通过编写新的代码来完成,而在上述例子中可以通过解释一个脚本来实现。
参考:c++编程思想2