C++设计模式——命令模式(command pattern)

一、原理讲解

别名动作(action),事务(transaction)。

1.1意图

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

1.2应用场景

  • 抽象出待执行的动作以参数化某对象;
  • 在不同的时刻指定、排列和执行请求;(比如跨进程传递命令对象)
  • 支持取消操作;
  • 支持修改日志,当系统奔溃时这些修改可被重做一次;
  • 用构建在原语操作上的高层操作构造一个系统;

1.3结构图(UML图)

C++设计模式——命令模式(command pattern)_第1张图片

1.4代码实现步骤

a1 定义接口命令类Command,定义一个执行接口函数execute();
a2 定义一个具体命令类ConcreteCommand,重写接口函数execute(),并且定义一个接收者指针Receiver reveiver,该指针reveiver对调用者类Invoker隐藏;
a3 定义一个接收者类Receiver,定义一个动作函数action(),里面实现接收到命令的具体业务逻辑;
a4 定义一个调用者类Invoker,定义一个接口函数executeCommand(),并且定义一个命令指针Command *command,通过该指针执行和处理命令;

二、实现代码

CommandPattern.cpp

#include 
#include 
#include 

using namespace std;

#define DELETE(pointer) delete (pointer); (pointer)=nullptr

class Receiver
{
public:
	void action() { cout << "Receiver::action()" << endl; }
};

class Command
{
public:
	virtual ~Command() {}
	virtual void execute() = 0; // 执行函数
};

class ConcreteCommand : public Command
{
	Receiver *receiver; // 接收者,只对Command开放,对Invoker隐藏
public:
	ConcreteCommand(Receiver *receiver) : receiver(receiver){}
	void execute() override { receiver->action(); }
};

class Invoker
{
	Command *command;
public:
	Invoker() :command(nullptr) {}
	bool setCommand(Command *command) {
		if (command == nullptr)
			return false;
		this->command = command;
		return true;
	}
	void executeCommand() {
		if (command == nullptr)
			return ;
		command->execute();
	}
};

void doCommandPattern()
{
	Receiver *receiver = new Receiver();
	Command *command = new ConcreteCommand(receiver);
	Invoker *invoker = new Invoker();
	if (!invoker->setCommand(command))
	{
		cout << "set command err, please repeate operation!" << endl;
		return;
	}
	invoker->executeCommand();

	DELETE(receiver);
	DELETE(command);
	DELETE(invoker);
}

mian.cpp

#include 

extern void doCommandPattern();

int main()
{
	doCommandPattern();
	
	system("pause");
	return 1;
}

C++设计模式——命令模式(command pattern)_第2张图片

三、总结

命令模式主要是将请求封装成对象,从而用不同参数对客户端进行参数化。实现的主要思路是命令类做执行操作,接收者类做具体动作action,调用者类调用命令类指针实现具体命令功能流程。

3.1相关模式

  • Composite可用来实现宏命令;
  • Memento可用来保持某个状态,命令用这一状态来取消它的效果;

四、参考内容

命令模式C++实现
Command Pattern – 命令模式原理及实现(C++)
设计模式–命令模式C++实现
C++设计模式—命令模式
陈建忠设计模式(参考:哔哩哔哩C++设计模式!!!)
Erich Gamma,Richard Helm.《设计模式 可复用面向对象软件的基础》[M].机械工业出版社,2019:

你可能感兴趣的:(设计模式,c++,设计模式,命令模式,command,mode)