目录
基本概念
命令模式(Command),将一个请求封装为对象,从而使你看用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。
命令模式的作用:
1. 能比较容易的设计一个命令队列;
2. 在需要的情况下,可以比较容易地将命令记入日志;
3. 允许接收请求的一方决定是否要否决请求;
4. 可以容易的实现对请求的撤销和重做;
5. 由于加进的新的具体命令类不影响其他类,因此增加新的具体命令类很容易。
UML图如下(此图来源于大话设计模式)
代码与实例
程序运行截图如下:
源码如下:
Head.h
#ifndef HEAD_H
#define HEAD_H
#include <iostream>
#include <string>
using namespace std;
//Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作文一个接收者
class Receiver{
public:
void action();
~Receiver();
};
//Command类,用来声明执行操作的接口
class Command{
public:
virtual void execute();
Command(Receiver *receiver);
virtual ~Command();
protected:
Command();
Command(Command &c);
Command &operator = (Command &c);
Receiver *m_receiver;
};
//ConcreteCommand类,将一个接收者对象绑定于一个动作,调用接收这相应的操作,以实现Execute
class ConcreteCommand: public Command{
public:
ConcreteCommand(Receiver *receiver);
void execute();
~ConcreteCommand();
};
//Invoker类,要求该命令执行这个请求
class Invoker{
public:
void setCommand(Command *command);
void executeCommand();
private:
Command *m_command;
};
#endif
Head.cpp
#include "Head.h"
void Command::execute()
{
}
Command::~Command()
{
cout << "Command::~Command()" << endl;
}
Command::Command()
{
}
Command::Command(Command &c)
{
}
Command::Command(Receiver *receiver)
{
m_receiver = receiver;
}
Command & Command::operator=(Command &c)
{
return Command();
}
void Receiver::action()
{
cout << "执行请求!" << endl;
}
Receiver::~Receiver()
{
cout << "Receiver::~Receiver()" << endl;
}
ConcreteCommand::ConcreteCommand(Receiver *receiver) : Command(receiver)
{
}
void ConcreteCommand::execute()
{
m_receiver->action();
}
ConcreteCommand::~ConcreteCommand()
{
cout << "ConcreteCommand::~ConcreteCommand()" << endl;
}
void Invoker::setCommand(Command *command)
{
m_command = command;
}
void Invoker::executeCommand()
{
m_command->execute();
}
main.cpp
#include "Head.h"
int main(int *argc, int *argv){
Receiver *r = new Receiver;
Command *c = new ConcreteCommand(r);
Invoker *i = new Invoker;
i->setCommand(c);
i->executeCommand();
delete r;
delete c;
delete i;
getchar();
return 0;
}