首页 > 代码库 > 命令模式

命令模式

1,命令模式是将一类对象的功能(行为,功能)抽象成一个命令对象,客户端在使用的时候,只与该命令对象打交道,而不用与对象打交道,分离命令的请求者和命令的执行者,降低了耦合性,可以使用不同的请求对客户进行参数化提高了程序设计的灵活性。

2,例子,饭馆吃饭,有吃羊肉串的,有吃烤鸡翅的,然后服务员不管做,而仅仅是告诉厨师,然后由出事去做就可以了

3,代码

// 命令模式.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <list>
using namespace std;

//接受者执行命令的类(厨师)
class Cooker{
public:
	void bakeMutton(){
		cout << "烤羊肉串" << endl;
	}
	void bakeChickenWing(){
		cout << "烤鸡翅" << endl;
	}
};


//命令
class Command{
protected:
	Cooker *receiver;
public:
	Command(Cooker * recv) :receiver(recv){}
	virtual void executeCommand() = 0;
};


//命令的传送者
class BakeMuttonCommand :public Command{
public:
	BakeMuttonCommand(Cooker *recv) :Command(recv){}
	void executeCommand(){
		receiver->bakeMutton();
	}
};


class BakeChickenWingComand :public Command{
public:
	BakeChickenWingComand(Cooker *recv) :Command(recv){}
	void executeCommand(){
		receiver->bakeChickenWing();
	}
};


class Waiter{
private:
	list<Command *> orders;
public:
	void setOrder(Command *cmd){
		orders.push_back(cmd);
	}
	void cancelOrder(Command *cmd){

	}
	void notify(){
		list<Command *>::iterator iter = orders.begin();
		while (iter != orders.end())
		{
			(*iter)->executeCommand();
			iter++;
		}
	}
};

int _tmain(int argc, _TCHAR* argv[])
{

	Cooker *cker = new Cooker();
	Command *cmd1 = new BakeMuttonCommand(cker);
	Command *cmd2 = new BakeMuttonCommand(cker);
	Command *bc1 = new BakeChickenWingComand(cker);

	Waiter *g = new Waiter();

	g->setOrder(cmd1);
	g->setOrder(cmd2);
	g->setOrder(bc1);
	
	g->notify();
	cin.get();
		
	return 0;
}

4,UML

技术分享

5,1)命令模式将发出命令的责任和执行命令的责任分割开,降低系统的耦合度

  2)每一个命令都需要设计一个具体命令类,使用命令模式会导致某些系统有过多的具体命令类。


命令模式