概念
命令模式是一种行为设计模式,它的核心思想就是将请求封装为一个对象,此对象包含与请求相关的所有信息。可以用不同的请求对客户进行参数化。命令模式通过将请求的发送者和接收者解耦,支持请求的排队、记录、撤销等操作。
使用场景
1、如果需要通过参数来操作对象,可以使用命令模式。
2、如果想要把操作放入到对象中进行操作执行或者远程执行操作就需要命令模式。
3、如果想要实现操作回滚操作,就需要用到命令模式。
实现方式
1、使用命令模式需要至少创建三个类,一个命令的接口类,一个是命令的调用类,一个实际接受者对象(简单命令可以没有);
2、创建一个仅有一个执行方法的命令接口。通过继承命令接口创建一系列不同的具体命令类,具体命令类中实现方法。每个具体的命令类必须保存请求参数和实际接受者对象的引用。所有的变量只能在构造函数中进行初始化。
3、创建命令的调用类,也是发送命令的类,在这些类中添加保存命令的成员变量,发生者只能通过命令接口与其命令进行交互,发送者本身不创建对象,命名对象是通过参数设置到调用类的。
4、客户端的初始化。
1)创建接受者
2)创建命令,有需要的话可以关联接受者对象。
3)创建发送者,需要将命令进行关联(也就是将命令设置到发送者)。
类结构图
示例代码
#include "MingLingMoShi.h"
int main()
{
std::cout << "欢迎东哥来到设计模式的世界!\n";
//创建命令对象
CommandBase* command = new ConcreteCommend();
CommandBase* command1 = new ConcreteCommend1();
//创建调用者
Invoker invoker;
invoker.setCommend(command);
invoker.execte();
invoker.setCommend(command1);
invoker.execte();
}
#pragma once
#include <iostream>
using namespace std;
//接受者类
class Receiver {
public:
Receiver() {}
~Receiver() {}
void execte() {
cout << "Receiver 接收者对象执行操作函数" << endl;
}
};
//命令基类
class CommandBase
{
public:
CommandBase() {}
~CommandBase() {}
virtual bool execte() = 0;
};
//具体命令,不使用接受者
class ConcreteCommend : public CommandBase {
public:
ConcreteCommend() {}
~ConcreteCommend() {}
bool execte() {
cout << "ConcreteCommend 没有使用接受者的命令对象" << endl;
return true;
}
};
//具体命令,使用接受者
class ConcreteCommend1 : public CommandBase {
public:
ConcreteCommend1() {}
~ConcreteCommend1() {}
bool execte() {
cout << "ConcreteCommend1 使用接受者的命令对象" << endl;
m_receiver = new Receiver();
m_receiver->execte();
return true;
}
private:
Receiver* m_receiver;
};
//调用者
class Invoker {
public:
Invoker() {}
~Invoker() {}
void setCommend(CommandBase * command) {
m_command = command;
}
void execte() {
m_command->execte();
}
private:
CommandBase* m_command;
};