图片引用于百度
简介:命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开,使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递
优点:降低对象之间的耦合度,提高类的灵活度
缺点:可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用
例子背景:简易的撤销功能
命令模式代码:
- 接收者类 :
#pragma once
#include <string>
#include <vector>
using namespace std;
class Receiver
{
public:
Receiver() = default;
virtual ~Receiver() = default;
private:
vector<string> m_lstStr;
public:
void AddString(const string& str)
{
m_lstStr.push_back(str);
}
string Undo()
{
if(m_lstStr.empty()) return "";
m_lstStr.pop_back();
string ret;
for(auto& str : m_lstStr)
ret += str;
return ret;
}
};
- 抽象命令类:
#pragma once
#include "Receiver.h"
class AbstractCommand
{
public:
AbstractCommand() = default;
virtual ~AbstractCommand() = default;
public:
virtual void AddString(const string& str) = 0;
virtual string Undo() = 0;
};
- 具体命令类:
#pragma once
#include "AbstractCommand.h"
class Command : public AbstractCommand
{
public:
Command(Receiver* receiver) : m_receiver(receiver) {}
virtual ~Command() = default;
private:
Receiver* m_receiver;
public:
virtual void AddString(const string& str)
{
m_receiver->AddString(str);
}
virtual string Undo()
{
return m_receiver->Undo();
}
};
- 调用者类:
#pragma once
#include "Command.h"
class Invoker
{
public:
Invoker(Command* com) : m_command(com) {}
~Invoker() = default;
private:
Command* m_command;
public:
void AddString(const string& str)
{
m_command->AddString(str);
}
string Undo()
{
return m_command->Undo();
}
};
- 引用:
#include "Invoker.h"
#include <iostream>
int main()
{
Receiver* receiver = new Receiver;
Command* command = new Command(receiver);
Invoker* invoker = new Invoker(command);
invoker->AddString("你");
invoker->AddString("好");
invoker->AddString("世");
invoker->AddString("界");
invoker->AddString("!");
invoker->AddString("要被删除的");
cout << invoker->Undo() << endl;
delete receiver;
delete command;
delete invoker;
getchar();
return 0;
}
总结:
命令模式(Command):发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求,方便扩展
作者:丶梦爱
博客:https://blog.csdn.net/u014732297(转载请说明出处)