文章目录


行为型模式----命令模式

将一个请求封装为一个对象,使发出请求的责任与执行请求的责任分割开,也就是说,将命令的请求者和命令执行者两者之间实现“松耦合”,方便对行为进行“记录、撤销”等操作

结构与实现

模式的结构

  • 抽象命令:声明执行命令的接口,拥有执行命令的抽象方法
  • 具体命令:是抽象命令的具体实现类,它拥有接受者对象,并通过调用接收者的功能来完成命令要执行的操作
  • 调用者:是请求的发送者,它通常拥有多个命令对象,并通过访问命令对象来执行相关请求,但它不直接访问接受者
  • 接受者:执行命令功能的相关操作,是具体命令对象业务的真正实现者

命令模式的UML类图

行为型模式----命令模式(C++)_命令模式

命令模式特点

优点

  • 降低系统耦合度
  • 操作命令更加方便,符合“开闭原则”
  • 方便实现“撤销”,“恢复”的功能

缺点
  • 可能产生大量的具体命令类,增加系统复杂度

命令模式实例

#include <iostream>
#include <deque>
using namespace std;


//接受者:厨师
class chef
{
public:
void makeBaozi()
{
cout << "我在做包子!!!" << endl;
}

void makeYoutiao()
{
cout << "我在做油条!!!" << endl;
}

void makeDoujiang()
{
cout << "我在做豆浆!!!" << endl;
}
};

//抽象命令:早餐
class AbstractBreakfast
{
public:
AbstractBreakfast(chef* p)
{
this->pChef = p;
}

virtual void excute()= 0;
protected:
chef* pChef;
};

//具体命令1:豆浆
class doujiang : public AbstractBreakfast
{
public:
doujiang(chef* p) : AbstractBreakfast(p) {}

void excute(){
pChef->makeDoujiang();
}
};

//具体命令2:包子
class baozi : public AbstractBreakfast
{
public:
baozi(chef* p) : AbstractBreakfast(p) {}

void excute() {
pChef->makeBaozi();
}
};

//具体命令3:油条
class youtiao : public AbstractBreakfast
{
public:
youtiao(chef* p) : AbstractBreakfast(p) {}

void excute() {
pChef->makeYoutiao();
}
};

//调用者:服务员
class waiter
{
public:
void addCommand(AbstractBreakfast* order)
{
Orders.push_back(order);
}

void removeCommand(AbstractBreakfast* order)
{
auto it = find(Orders.begin(), Orders.end(), order);
if (it != Orders.end())
Orders.erase(it);
}

void submitCommand()
{
deque<AbstractBreakfast*>::iterator it = Orders.begin();
while (it != Orders.end())
{
(*it)->excute();
*it++;
}
}
private:
deque<AbstractBreakfast*> Orders;
};


int main()
{
waiter* pWaiter = new waiter;
chef* pChef = new chef;

pWaiter->addCommand(new baozi(pChef));
pWaiter->addCommand(new doujiang(pChef));
pWaiter->addCommand(new youtiao(pChef));
pWaiter->submitCommand();

delete pWaiter;
delete pChef;

system("pause");
return 0;
}