设计模式之命令模式

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

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

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

 

  • 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值