行为型模式-命令模式

命令模式

  • 将一个请求封装成一个对象,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
  • UML图:
    在这里插入图片描述

例子

说明:在路边大排档,客人有需要考串,烤鸡腿等命令。客人将命令传给服务员,服务员再将命令交给厨师。


厨师类:能够执行:烤串、烤鸡腿命令

class Cooker
{
public:
	void MakeShashlik()
	{
		cout << "进行烤串" << endl;
	}
	void MakeChiken()
	{
		cout << "进行烤鸡腿" << endl;
	}
};

命令类:


class Command
{
public:
	Command(Cooker& cooker)
	{
		m_cooker = cooker;
	}

	virtual void excute() = 0;

protected:
	Cooker m_cooker;
};


烤串命令

class CommandOfShashlik :public Command
{
public:
	CommandOfShashlik(Cooker& cooker) :Command(cooker)
	{
	}

	virtual void excute()
	{
		m_cooker.MakeShashlik();
	}
};


烤鸡腿命令

class CommandOfChiken :public Command
{
public:
	CommandOfChiken(Cooker& cooker) :Command(cooker)
	{
	}

	virtual void excute()
	{
		m_cooker.MakeChiken();
	}
};


服务员类:将客人的命令收集到list,然后统一交给厨师执行


class Waitress
{
public:
	void SetCommand(Command* command)
	{
		list_comd.push_back(command);
	}

	void PlaceOrder()
	{
		list<Command*>::iterator it = list_comd.begin();
		for (; it != list_comd.end(); it++)
		{
			(*it)->excute();
		}
	}

private:
	list <Command*> list_comd;
};


调用:


int main()
{

	Waitress waitress;
	Cooker cooker;

	CommandOfChiken* Chiken = new CommandOfChiken(cooker);
	CommandOfShashlik* Shashlik= new CommandOfShashlik(cooker);

	waitress.SetCommand(Chiken);
	waitress.SetCommand(Shashlik);

	waitress.PlaceOrder();

	return 0;
}

结果:最后厨师执行客人的两个命令
在这里插入图片描述



  • 优点:
       (1) 降低系统的耦合度。由于请求者与接收者之间不存在直接引用,因此请求者与接收者之间实现完全解耦,相同的请求者可以对应不同的接收者,同样,相同的接收者也可以供不同的请求者使用,两者之间具有良好的独立性。

        (2) 新的命令可以很容易地加入到系统中

        (3) 可以比较容易地设计一个命令队列


  • 缺点:
      需使用命令模式可能会导致某些系统有过多的具体命令类。

  • 使用场景:
        (1) 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
        (2) 系统需要在不同的时间指定请求、将请求排队和执行请求。
        (3) 系统需要将一组操作组合在一起形成宏命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值