其他分享
首页 > 其他分享> > 设计模式之命令模式

设计模式之命令模式

作者:互联网

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

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

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

 

#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 私信 关注

标签:std,unique,icecream,void,模式,命令,设计模式,public
来源: https://blog.csdn.net/qq_43145594/article/details/104383603