现实生活中命令模式无处不在,比如我们去餐厅吃饭,服务员记录我们想要的食物的名称,然后放到后台,过一会厨师拿到订就可以烹饪食物了。而命令模式所发挥的作用就是把客户想要的食物而发出的命令(也就是订单)进行封装,这样客户便不会知道食物是如何做的(这是厨师的事情)。因此,命令模式可以将“发出请求的对象”和“执行请求的对象”进行解耦,也就是说二者是相互独立的,没有任何关联。
命令模式:将“请求的命令”封装成对象,以便使用不同的请求,队列或者日志参数化其他对象。命令模式也支持撤销动作。
现在让我们通过类图来对命令模式进行分析:
- Requester和Executor通过对命令进行封装间接的进行交互(也就是说二者独立,命令对象为中间的桥梁)
- Requester可以调用具体的命令让Executor执行。
- 命令对象的父类必须具有执行命令的行为的接口,进而抽象出多个具体的子类。也就是说命令对象与执行Executor具有组合或者聚合关系。Requester发出命令,因此与Command具有组合或者聚合关系。
- 命令的执行者执行请求着发出的命令,因此Executor可以替换成工厂模式。
#include<iostream>
#include<memory>
class IceCream { //可以为工厂模式,对产品进行加工并产出
public:
virtual void eat() = 0;
virtual void noeat() = 0;
};
class HDIceCream :public IceCream {
public:
void eat()override { std::cout << "eat HDIceCream" << std::endl; };
void noeat()override { std::cout << "noeat HDIceCream" << std::endl; };
};
class Command {
public:
virtual void execute() = 0;
virtual ~Command() {};
protected:
IceCream* icecream;
};
class EatCommand :public Command {
public:
EatCommand(IceCream* _icecream) { icecream = _icecream; };
~EatCommand() { icecream->eat(); };
public:
void execute()override { icecream->noeat(); };
};
class NoEatCommand :public Command {
public:
NoEatCommand(IceCream* _icecream) { icecream = _icecream; };
~NoEatCommand() {};
public:
void execute()override { icecream->noeat(); };
};
class Client {
public:
Client(Command* _command) :command(_command) {};
~Client() {};
void Dosamething() { std::cout << "happy" << std::endl; };
private:
Command* command;
};
int main(void) {
std::unique_ptr<HDIceCream>hdptr(std::make_unique<HDIceCream>());
std::unique_ptr<EatCommand>eaptr(std::make_unique<EatCommand>(hdptr.get()));
std::unique_ptr<Client>clptr(std::make_unique<Client>(eaptr.get()));
clptr->Dosamething();
return 0;
}
Cry .
发布了81 篇原创文章 · 获赞 11 · 访问量 5502
私信
关注