C++设计模式详解之命令模式解析
原创
©著作权归作者所有:来自51CTO博客作者DT陶喆的原创作品,请联系作者获取转载授权,否则将追究法律责任
C++ 命令模式定义
- 命令模式将请求封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。
- 个人理解: 命令模式,其实实质上就是去耦合的操作,让各个部分尽可能的关联性降低,以便修改或增加某些功能。
命令模式实例
简单的来说,就是订外卖,就是最好的命令模式的展示,用户下单,订单再通知到商户,商户执行操作。
头文件: 定义厨师 店长 命令 以及用户调用的类
#include "stdafx.h"
using namespace std;
//Receiver基类
class Receiver
{
public:
virtual void Action() = 0;
virtual void DeleteAction()= 0;
};
//厨师
class CookReceiver:public Receiver
{
public:
void Action();
void DeleteAction();
};
//店长
class ManagerReceiver:public Receiver
{
public:
void Action();
void DeleteAction();
};
//命令基类
class Command
{
public:
virtual void Excute() = 0;
virtual void SetReceiver(Receiver* r) = 0;
};
class AddCommand:public Command
{
private:
list<Receiver*>m_list_receiver;
public:
void Excute();
void SetReceiver(Receiver* r) ;
};
class DelCommand:public Command
{
private:
list<Receiver*>m_list_receiver;
public:
void Excute();
void SetReceiver(Receiver* r) ;
};
//执行命令类
class Invoker
{
private:
list<Command*>m_commands;
public:
void setCommand(Command* c);
void Notify();
};
实现文件:
// CommandDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "CommandDemo.h"
using namespace std;
//具体实现
//Invoker类
void Invoker::setCommand(Command* c)
{
m_commands.push_back(c);
}
void Invoker::Notify()
{
//执行对应操作
for (auto c_com = m_commands.begin();c_com!=m_commands.end();c_com++)
{
(*c_com)->Excute();
}
}
//Command类
void AddCommand::SetReceiver(Receiver* r)
{
m_list_receiver.push_back(r);
}
void AddCommand::Excute()
{
//执行对应操作
for (auto c_com = m_list_receiver.begin();c_com!=m_list_receiver.end();c_com++)
{
(*c_com)->Action();
}
}
void DelCommand::SetReceiver(Receiver* r)
{
m_list_receiver.push_back(r);
}
void DelCommand::Excute()
{
//执行对应操作
for (auto c_com = m_list_receiver.begin();c_com!=m_list_receiver.end();c_com++)
{
(*c_com)->DeleteAction();
}
}
//Receiver类
void CookReceiver::Action()
{
cout << "厨师炒菜" << endl;
}
void CookReceiver::DeleteAction()
{
cout << "厨师下班" << endl;
}
void ManagerReceiver::Action()
{
cout << "店长接单" << endl;
}
void ManagerReceiver::DeleteAction()
{
cout << "店长下班" << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
//设置命令
Command *del_c = new DelCommand(); //结束的命令
Receiver* del_r = new CookReceiver(); //设置接收者为厨师
del_c->SetReceiver(del_r); //这个命令是给厨师的
Command *add_c = new AddCommand(); //添加的命令
Receiver* add_r = new ManagerReceiver(); //设置接收者为店长
add_c->SetReceiver(add_r); //这个命令是给厨师的
//调用命令
Invoker inv_i;
inv_i.setCommand(del_c);//设置执行的命令
inv_i.setCommand(add_c);
//执行
inv_i.Notify();
system("pause");
return 0;
}
运行结果:
命令模式优缺点
- 最大的优点就是去耦合 更方便的去实现业务
- 缺点就是类特别多 需要实现的类很多,管理上面不太方便。