一、命令模式
命令模式是一种对象行为模式,将一个请求封装成一个对象,进而可以用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
发送请求的对象只要知道怎么发送请求,而不用知道是如何完成请求的。
二、例子
在下面的例子中,由于客户端不同请求在服务端的处理方法接口均不一致,因此,需要将这些请求都使用一个接口 AbstractCmd 统一起来,这样,就能将这些请求统一放到服务器中执行。
只要来了一个请求,就 new 一个这样的对象放到服务器队列中,让服务器端自行处理即可
#include <iostream>
#include <queue>
#include <Windows.h>
using namespace std;
class HandleProto {
public:
// 客户端请求1对应的服务端处理方法
void process1() {
cout << "process1...\n";
}
void process2() {
cout << "process2...\n";
}
void process3() {
cout << "process3...\n";
}
};
// 命令接口
class AbstractCmd {
public:
virtual void handle() = 0;
};
class Process1Cmd : public AbstractCmd {
public:
Process1Cmd(HandleProto* proto) {
p_proto = proto;
}
virtual void handle() {
p_proto->process1();
}
HandleProto* p_proto;
};
class Process2Cmd : public AbstractCmd {
public:
Process2Cmd(HandleProto* proto) {
p_proto = proto;
}
virtual void handle() {
p_proto->process2();
}
HandleProto* p_proto;
};
class Process3Cmd : public AbstractCmd {
public:
Process3Cmd(HandleProto* proto) {
p_proto = proto;
}
virtual void handle() {
p_proto->process3();
}
HandleProto* p_proto;
};
class Server {
public:
void addRequest(AbstractCmd* cmd) {
qCmds.push(cmd);
}
void startHandle() {
while (!qCmds.empty()) {
AbstractCmd* cmd = qCmds.front();
cmd->handle();
qCmds.pop();
Sleep(2000);
}
}
queue<AbstractCmd*> qCmds;
};
void test() {
HandleProto* protocol = new HandleProto;
// 客户端请求过来
AbstractCmd* process1 = new Process1Cmd(protocol);
AbstractCmd* process2 = new Process2Cmd(protocol);
AbstractCmd* process3 = new Process3Cmd(protocol);
Server* server = new Server;
// 将客户端请求加入队列
server->addRequest(process1);
server->addRequest(process2);
server->addRequest(process3);
// 服务器开始处理请求
server->startHandle();
}
int main() {
test();
return 0;
}