您的位置:首页 > 编程语言 > C语言/C++

设计模式C++描述----19.命令(Command)模式

2012-05-17 18:16 495 查看
一. 举例说明


我们知道,在多线程程序中,多个用户都给系统发 Read 和 Write 命令。这里有几点需要说明:

1. 首先明确一点,所有的这些 Read 和 Write 命令都是调用一个库函数。

2. 用户并不需要知道别的用户的存在,也不管别人发不发命令,只管自己发命令,最后给结果即可。

3. 这些命令先是到了一个消息队列里面,然后由消息队列调用库函数。

结构图如下:



代码如下:

class Command;

//实施与执行类
class Reciever 
{ 
public: 
	void Action()
	{
		cout<<"Do action !!"<<endl;
	}
};

//抽象命令类
class Command 
{ 
public: 
	virtual ~Command() {}

	virtual void Excute() = 0;

protected: 
	Command() {}
};

//Read 命令
class Read_Command:public Command 
{ 
public: 
	Read_Command(Reciever* rev)
	{
		this->_rev = rev;
	}

	~Read_Command()
	{
		delete this->_rev;
	}

	void Excute()
	{
		cout<<"Read Command..."<<endl; 
		_rev->Action();
	}

private: 
	Reciever* _rev; 
};

//Write 命令
class Write_Command:public Command 
{ 
public: 
	Write_Command(Reciever* rev)
	{
		this->_rev = rev;
	}
	
	~Write_Command()
	{
		delete this->_rev;
	}
	
	void Excute()
	{
		cout<<"Write_Command..."<<endl; 
		_rev->Action();
	}
	
private: 
	Reciever* _rev; 
};

//要求命令执行的类
class Invoker
{ 
public: 
	Invoker(Command* cmd)
	{
		_cmd = cmd;
	}

	Invoker()
	{
	}

	~Invoker()
	{
		delete _cmd;
	}

	//通知执行类执行
	void Notify()
	{
		list<Command*>::iterator it = cmdList.begin();
		
		for (it; it != cmdList.end(); ++it)
		{
			_cmd = *it;
		  _cmd->Excute();
		}
	}

	//添加命令
	void AddCmd(Command* pcmd)
	{
		cmdList.push_back(pcmd);
	}
	
	//删除命令
	void DelCmd(Command* pcmd)
	{
		cmdList.remove(pcmd);
	}

private: 
	Command* _cmd; 

	list<Command*> cmdList;
};

//测试代码
int main(int argc,char* argv[]) 
{ 
	Reciever* rev = new Reciever(); //定义一个执行类
	
	Command* cmd1 = new Read_Command(rev);//Read 命令
	Command* cmd2 = new Write_Command(rev);//Write 命令

	Invoker inv; //管理所有命令
	
	inv.AddCmd(cmd1);
	inv.AddCmd(cmd2);
	inv.Notify(); //通知执行类,执行

	inv.DelCmd(cmd1);
	inv.Notify();

	return 0; 
}


二. 命令模式


定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户时行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。



优点:

1. 它能比较容易地设计一个命令队列。

2. 在需要的情况下,可以较容易地将命令记入日志。

3. 允许接收请求的一方决定是否要否决请求。

4. 可以容易地实现对请求的撤销和重做。

5. 增加新的具体命令类很容易

6. 把请求一个操作的对象(Command)与知道怎么执行一个操作的对象(Receiver)分割开来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: