命令模式
命令模式是一种对象行为型模式,是23种GOF设计模式之一。代理模式,是将一个请求封装成一个对象,从而让用户可以用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系。发送请求的只需要知道如何让发送请求,二不必知道如何完成请求。
例子:
#include <iostream>
#include <queue> // queue 队列
#include <Windows.h> // Sleep() 函数
using namespace std;
// 协议处理类
class HandleClientProtocol
{
public:
// 处理煮饭请求
void CookRice() { cout << "电饭锅,煮饭!" << endl; }
// 处理煮粥请求
void CookCongee() { cout << "电饭锅,煮粥!" << endl; }
// 处理煮汤
void BoilSoup() { cout << "电饭锅,煮汤!" << endl; }
};
//命令接口
class AbstractCommand
{
public: virtual void handle() = 0;//处理客户端请求的接口
};
// 命令接口实现对象 :处理煮饭请求
class CookRiceCommand :public AbstractCommand
{
public:
CookRiceCommand(HandleClientProtocol*hcp) { handleClientProtocol = hcp; }
virtual void handle() { handleClientProtocol->CookRice(); }
public: HandleClientProtocol * handleClientProtocol; // 接收者
};
// 命令接口实现对象 :处理煮粥请求
class CookCongeeCommand :public AbstractCommand
{
public:
CookCongeeCommand(HandleClientProtocol*hcp) { handleClientProtocol = hcp; }
virtual void handle() { handleClientProtocol->CookCongee(); }
public: HandleClientProtocol * handleClientProtocol; // 接收者
};
// 命令接口实现对象 :处理煮汤
class BoilSoupCommand :public AbstractCommand
{
public:
BoilSoupCommand(HandleClientProtocol*hcp) { handleClientProtocol = hcp; }
virtual void handle() { handleClientProtocol->BoilSoup(); }
public: HandleClientProtocol * handleClientProtocol; // 接收者
};
//服务器
class Server
{
public:
// 将命令添加到队列中
void addResult(AbstractCommand*ac) { qCommandS.push(ac); };
// 执行命令
void startHandle()
{
while (!qCommandS.empty()) // 当命令不为空时
{
Sleep(1500); // 睡眠1500毫秒
AbstractCommand * command = qCommandS.front();
command->handle();
qCommandS.pop();
}
}
public:
queue<AbstractCommand*> qCommandS; // 队列,存放命令
};
void main()
{
HandleClientProtocol *hcp = new HandleClientProtocol;
AbstractCommand * amc = new CookRiceCommand(hcp);
AbstractCommand * aec = new CookCongeeCommand(hcp);
AbstractCommand * alc = new BoilSoupCommand(hcp);
Server *server = new Server;
//将客户端的请求加入到处理的队列中
server->addResult(amc); // 煮饭
server->addResult(aec); // 煮粥
server->addResult(alc); // 煮汤
server->startHandle(); // 执行命令
}
运行结果:
命令模式的优缺点:
优点: 1、降低了对象之间的耦合度。
2、添加新命令的难度低。
3、设计命令组合比较容易。
缺点: 当系统中右很多的命令的时候,因为一个命令就有一个具体的类,所以会导致系统中右大量的命令类存在。
感谢您的浏览。