[设计模式]Command命令模式

command命令模式

Command模式通过将请求封装到一个对象(Command)中,并将请求的接收者存放到具体的ConcreteCommand类中的(reciver)中,从而实现调用操作的对象和操作的具体实现之间的解耦。

解析:Command模式的思想是把命令封装在一个类(Command)中,同时把接收对象也封装在一个类(Receive)中,由调用这个命令的类(Invoker)来调用。其实,如果弄清楚了Command模式的原理,就会发现其实它和注册回调函数的原理很相似,而在面向过程的设计中的回调函数其实和这里的Command类的作用是一致的。采用Command模式解耦了命令的发出者和命令的执行者。

小demo

command.h

#ifndef COMMAND_H
#define COMMAND_H

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

class Receiver
{
public:
	void Action();
};

class Invoker
{
public:
	Invoker(Command *pCommand);
	~Invoker();
	void Invoke();
private:
	Command *m_pCommand;
};

class ConcreateComand	: public Command
{
public:
	ConcreateComand(Receiver* pReceiver);
	virtual ~ConcreateComand();
	virtual void Execute();
private:
	Receiver* m_pReceiver;
};

#endif

command.cpp

#include "Command.h"
#include <iostream>

void Receiver::Action()
{
	std::cout << "Receiver Action\n";
}

Invoker::Invoker(Command *pCommand)	: m_pCommand(pCommand)
{
}

Invoker::~Invoker()
{
	delete m_pCommand;
	m_pCommand = NULL;
}

void Invoker::Invoke()
{
	if (NULL != m_pCommand)
	{
		m_pCommand->Execute();
	}
}

ConcreateComand::ConcreateComand(Receiver* pReceiver): m_pReceiver(pReceiver)
{
}

main.cpp

#include "Command.h"
#include <stdlib.h>

int main()
{
	Receiver* pReceiver = new Receiver();
	Command*  pCommand  = new ConcreateComand(pReceiver);
	Invoker*  pInvoker  = new Invoker(pCommand);

	pInvoker->Invoke();
	delete pInvoker;
	system("pause");
	return 0;
}

Command模式的思想非常简单,但是Command模式也十分常见,并且威力不小。实际上,command模式关键就是提供一个抽象的command类,并将执行操作封装到command类接口中,command类中一般就只是一些接口的集合,并不包含任何的数据属性。好处有:

1.command模式将调用操作的对象和知道如何实现该操作的对象解耦。在command的结构图中,Invoker对象根本就不知道具体的是哪个对象在处理Excute操作(当然要知道是Command类别的对象,也仅此而已)。

2.在command要增加新的处理操作对象很容易,我们可以通过创建新的继承自command的子类来实现这一点。

3.command模式可以喝memento模式结合起来,支持取消的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值