C++设计模式详解之命令模式解析
  TEZNKK3IfmPf 2024年03月29日 104 0
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;
}

运行结果:

C++设计模式详解之命令模式解析

命令模式优缺点

  • 最大的优点就是去耦合 更方便的去实现业务
  • 缺点就是类特别多 需要实现的类很多,管理上面不太方便。
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年03月29日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   16天前   22   0   0 C++
  TEZNKK3IfmPf   16天前   21   0   0 指针C++
TEZNKK3IfmPf