文章目录
行为型模式----命令模式
将一个请求封装为一个对象,使发出请求的责任与执行请求的责任分割开,也就是说,将命令的请求者和命令执行者两者之间实现“松耦合”,方便对行为进行“记录、撤销”等操作
结构与实现
模式的结构
- 抽象命令:声明执行命令的接口,拥有执行命令的抽象方法
- 具体命令:是抽象命令的具体实现类,它拥有接受者对象,并通过调用接收者的功能来完成命令要执行的操作
- 调用者:是请求的发送者,它通常拥有多个命令对象,并通过访问命令对象来执行相关请求,但它不直接访问接受者
- 接受者:执行命令功能的相关操作,是具体命令对象业务的真正实现者
命令模式的UML类图
命令模式特点
优点
- 降低系统耦合度
- 操作命令更加方便,符合“开闭原则”
- 方便实现“撤销”,“恢复”的功能
缺点
- 可能产生大量的具体命令类,增加系统复杂度
命令模式实例
#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;
}