文档章节

设计模式-行为-Command(命令)模式

梦想游戏人
 梦想游戏人
发布于 2016/05/04 21:43
字数 458
阅读 84
收藏 0

将行为的请求者 和 执行者  解耦,从而适应像 撤销/重做 等处理需求。

实现起来也很简单,吧请求封装到一个类(Command)中,在提供处理对象(Receiver)最后由Invoke调用。

  1. 我们可以通过回调的方式 吧处理请求的 处理对象封装为 参数 传递到到command中,可用函数指针也可用匿名函数。

  2. 处理对象(Receiver)可以用多个处理函数,来处理不同的命令。

  3. 处理对象(Receiver)还可以只有一个处理函数,通过传参  RTTI  来确定具体的操作。实现统一的处理接口


例1

class Receiver
{
public:
	virtual void Action()
	{
		cout << __FUNCTION__ << endl;
	}
};




class Command
{
public:
	virtual void Execute() = 0;

protected:
	Receiver*recver;

};



class ConCreateCommand :public Command
{
public:
	virtual void Execute()override
	{
		recver->Action();
	}

	ConCreateCommand(Receiver*recevier)
	{
		this->recver = recevier;
	}

};


class Invoker
{
public:
	void Invoke()
	{
		command->Execute();
	}
	Invoker(Command *com)
	{
		this->command = com;
	}
private:
	Command*command;

};


void testCommand()
{
	Receiver *recv = new Receiver;
	ConCreateCommand *com = new ConCreateCommand(recv);

	Invoker *invoke = new Invoker(com);

	invoke->Invoke();
}



例2

class ReceverTV
	{
	public:
		void ActionVolumeUp()
		{
			cout << __FUNCTION__ << endl;
		}
		void ActionPowerOn()
		{
			cout << __FUNCTION__ << endl;
		}

	};


	class Command
	{
	public:
		virtual void Execute() = 0;

	protected:
		ReceverTV *recv;
	};

	class CommandOn :public Command
	{
	public:
		virtual void Execute()override
		{
			cout << "power on" << endl;
			recv->ActionPowerOn();

		}
		CommandOn(ReceverTV *tv)
		{
			recv = tv;
		}
	};

	class CommandVolumeUp :public Command
	{
	public:
		virtual void Execute()
		{
			cout << "volume up" << endl;
			recv->ActionVolumeUp();
		}
		CommandVolumeUp(ReceverTV *tv)
		{
			recv = tv;
		}
	};
	class Invoker
	{

	public:
		void Invoke()
		{
			com->Execute();
		}
		Invoker(Command *com)
		{
			this->com = com;
		}
	private:
		Command*com;
	};



	void testCommand2()
	{
		ReceverTV*tv = new ReceverTV();

		auto *on = new CommandVolumeUp(tv);

		Invoker *invoke = new Invoker(on);
		invoke->Invoke();

	}


	void testCommand3()
	{
		ReceverTV*tv = new ReceverTV();
		auto *on = new CommandVolumeUp(tv);

		on->Execute();
	}


例3

#include <functional>


	class Receiver
	{
	public:
		virtual void Action()
		{
			cout << __FUNCTION__ << endl;
		}
	};


	class Command
	{
	public:
		virtual void Execute() = 0;
	};


	class CallbackCommand :public Command
	{
	public:
		virtual void Execute()override
		{
			if (recever)
				recever();
		}
		CallbackCommand(const std::function<void(void)>& recever)
		{
			this->recever = recever;
		}
	private:
		std::function<void(void)> recever = nullptr;

	};


	void testCommand4()
	{
		Receiver *rev = new Receiver;
		Command *com = new CallbackCommand([=]()
		{
			rev->Action();
		});
		com->Execute();

		//RTTI
	//	cout << typeid(com).hash_code();

		cout << (unsigned int)(com) << endl;;





		{
			Receiver *rev = new Receiver;
			Command *com = new CallbackCommand([=]()
			{
				rev->Action();
			});
			com->Execute();

			//RTTI
			//cout << typeid(com).hash_code();
			cout << (unsigned int)(com) << endl;


		}
	//	cout <<  (unsigned int)(com);



	}




© 著作权归作者所有

梦想游戏人
粉丝 38
博文 444
码字总数 127453
作品 0
成都
私信 提问
23种设计模式(10):命令模式

定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 类型:行为类模式 类图: 命令模式的结构 顾名思义,...

LCZ777
2014/07/07
0
0
设计模式的学习(11)命令模式

命令模式 命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型...

杨健-YJ
2018/12/28
0
0
《JavaScript设计模式与开发实践》模式篇(6)—— 命令模式

命令模式是最简单和优雅的模式之一,命令模式中的命令(command)指的是一个执行某些特定事情的指令。 应用场景 有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求...

嗨呀豆豆呢
2018/12/15
0
0
设计模式19——Command设计模式

Command命令设计模式将一个请求封装成一个对象,从而使你可用不同的请求对客户进行操作。Command命令设计模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的...

小米米儿小
2014/01/27
0
0
Ubuntu中vi卸载与安装/使用模式

Ubuntu中安装的vi是vim-common版本,与centos系统中vi使用方式不同,编辑使用不惯, 遂卸载重装,卸载命令:sudo apt-get remove vim-common 卸载完毕后重新安装;输入命令:sudo apt-get in...

唐十三郎
2018/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用kubeadm 搭建K8s集群

1. 参考官网 https://kubernetes.io/docs/setup/independent/install-kubeadm/

whhbb
27分钟前
2
0
Dubbo 3.0 !提升不止一点点!

Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网、网易考拉等互联网公司,也不乏中国人寿、青岛海尔等大型传统企业。 自去年 12 月开始,Dubbo 3.0 便已正...

编程SHA
28分钟前
2
0
提升不止一点点,Dubbo 3.0 预览版详细解读

Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网、网易考拉等互联网公司,也不乏中国人寿、青岛海尔等大型传统企业。更多用户信息,可以访问Dubbo @GitHub...

阿里云云栖社区
31分钟前
13
0
HanLP Analysis for Elasticsearch

基于 HanLP 的 Elasticsearch 中文分词插件,核心功能: 兼容 ES 5.x-7.x; 内置词典,无需额外配置即可使用; 支持用户自定义词典; 支持远程词典热更新(待开发); 内置多种分词模式,适合...

左手的倒影
53分钟前
1
0
spark部署之yarn模式

spark部署之yarn模式 hadoop-3.0.0集群搭建 配置相应环境 java环境 scala(可配可不配) hadoop环境 从官网下载spark 解压 配置 /conf/spark-env.sh export JAVA_HOME=/usr/java/jdk1.8.0_4...

jackmanwu
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部