设计模式之命令模式

现实生活中命令模式无处不在,比如我们去餐厅吃饭,服务员记录我们想要的食物的名称,然后放到后台,过一会厨师拿到订就可以烹饪食物了。而命令模式所发挥的作用就是把客户想要的食物而发出的命令(也就是订单)进行封装,这样客户便不会知道食物是如何做的(这是厨师的事情)。因此,命令模式可以将“发出请求的对象”和“执行请求的对象”进行解耦,也就是说二者是相互独立的,没有任何关联。

命令模式:将“请求的命令”封装成对象,以便使用不同的请求,队列或者日志参数化其他对象。命令模式也支持撤销动作。

现在让我们通过类图来对命令模式进行分析:

设计模式之命令模式 

  • 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 私信 关注
上一篇:python 全栈开发,Day125(HTML5+ 初识,HBuilder,夜神模拟器,Webview)


下一篇:CDS测试框架介绍:如何为ABAP CDS Entities写测试