命令模式(Command)
命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
吃烧烤的例子
紧耦合设计
#include <iostream>
using namespace std;
#define SAFE_DELETE(p) {if(p){delete p; p = nullptr;}}
//烤肉串者
class Barbecuer {
public:
void BakeMutton() {
cout << "烤羊肉串" << endl;
}
void BakeChickenWing() {
cout << "烤鸡翅" << endl;
}
};
//客户端
void test01() {
Barbecuer* boy = new Barbecuer();
boy->BakeMutton();
boy->BakeMutton();
boy->BakeMutton();
boy->BakeChickenWing();
//再加两串羊肉串和一串鸡翅
boy->BakeMutton();
boy->BakeMutton();
boy->BakeChickenWing();
SAFE_DELETE(boy);
}
int main() {
test01();
return 0;
}
松耦合设计
#include <iostream>
using namespace std;
#include <vector>
//烤肉串者
class Barbecuer {
public:
void BakeMutton() {
cout << "烤羊肉串" << endl;
}
void BakeChickenWing() {
cout << "烤鸡翅" << endl;
}
};
//抽象命令
class Command {
public:
Command() {}
virtual void ExcuteCommand() = 0;
};
//烤羊肉串命令
class BakeMuttonCommand :public Command {
public:
BakeMuttonCommand(Barbecuer* receiver):m_receiver(receiver){}
void ExcuteCommand() {
m_receiver->BakeMutton();
}
protected:
Barbecuer* m_receiver = nullptr;
};
//烤鸡翅命令
class BakeChickenWingCommand :public Command {
public:
BakeChickenWingCommand(Barbecuer* receiver) :m_receiver(receiver) {}
void ExcuteCommand() {
m_receiver->BakeChickenWing();
}
protected:
Barbecuer* m_receiver = nullptr;
};
//服务员
class Waiter {
private:
vector<Command*> m_vecOrders;
public:
void SetOrder(Command* command) {
m_vecOrders.push_back(command);
}
void Notify() {
for (auto it = m_vecOrders.begin(); it != m_vecOrders.end(); it++) {
(*it)->ExcuteCommand();
}
}
void ReleaseCommand() {
for (auto it = m_vecOrders.begin(); it != m_vecOrders.end(); it++) {
delete* it;
*it = nullptr;
}
}
};
//客户端
void test01() {
//开店前的准备
Barbecuer* boy = new Barbecuer();
Command* bakeMuttonCommand1 = new BakeMuttonCommand(boy);
Command* bakeMuttonCommand2 = new BakeMuttonCommand(boy);
Command* bakeChickenWingCommand1 = new BakeChickenWingCommand(boy);
Waiter* girl = new Waiter();
//开门营业
girl->SetOrder(bakeMuttonCommand1);
girl->SetOrder(bakeMuttonCommand2);
girl->SetOrder(bakeChickenWingCommand1);
girl->Notify();
girl->ReleaseCommand();
}
int main() {
test01();
return 0;
}