1、命令模式
可以理解为订单或则任务请求,将请求者与执行者分离开来,实现解耦,同时这也是一种面向接口编程
2、命令模式的一种实现方法:
command类:可以理解为菜单,有一个execute虚方法,用来执行请求(订单),子类需要重载该方法。
//订单 及命令类 一个方法用来执行命令
class command
{
private:
/* data */
public:
virtual void execute() ;
};
//*****************std;**********************************************
//这是一个命令的基础类 相当于 订单 命令
//***************************************************************
void command::execute() {
cout<<"默认的执行\n";
}
class CommandTest :public command
{
private:
Executor m_exe;
CommandTest();
public:
CommandTest(Executor exetor);
~CommandTest();
void execute();
};
//继承了 命令的基础类 具体的任务
CommandTest::CommandTest(Executor exetor)
{
cout<<("CommandTest :: 正在设置命令执行对象...\n");
m_exe = exetor;
}
CommandTest::~CommandTest()
{
}
void CommandTest::execute() {
cout<<("CommandTest :: 正在安排 执行对象 做事情 ...\n");
m_exe.todosomeThing();
}
Executor类:执行者,用来执行订单类及其派生类中具体的事物,执行者与command的子类是对应的关系,也可以是一组的关系(比如通过继承Executor,重载Executor的执行方法,相当于不同的厨师做同一个菜,味道不一样)
class Executor
{
private:
/* data */
public:
void todosomeThing();
};
//***************************************************************
//这是一个执行 命令的类 及 执行者
//***************************************************************
void Executor::todosomeThing() {
cout<<"Executor :: 正在做事情... \n";
}
contorl类:或者叫做派单机器,或者叫做点单员:用来将客户点的单传递给厨师让他根据订单做菜
class control
{
private:
command * m_com ;
public:
void setCommand(command &com);
void starCommand();
};
//***************************************************************
//这是一个发送 命令的类 及 控制者 客户 请求者
//***************************************************************
void control::setCommand(command &com)
{
cout<<"control ::正在设置命令\n";
m_com = &com;
}
void control::starCommand() {
cout<<"control :: 开始执行命令\n";
if(m_com != NULL) {
m_com->execute();
}
else {
cout<<("m_com为NULL 不做处理 \n" );
}
}
main.cpp
#include <iostream>
#include "command.h"
using namespace std;
int main() {
cout<<"helloworld \n";
Executor exe = Executor(); //创建一个执行者(招聘一个厨师)
CommandTest com = CommandTest(exe); //创建订单(订单指定厨师)
control con = control(); //创建一个服务员
con.setCommand(com);//服务员讲订单拿到厨房
con.starCommand();//服务员让厨师快点做菜
return 0;
}