命令模式结构图
意图:将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
其中:
- Command声明执行操作的接口。
- ConcreteCommand将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现Execute。
- Client创建一个具体命令对象并设定它的接收者。
- Invoker要求该命令执行这个请求。
- Receiver知道如何实施与执行一个请求相关的操作。任何类都可以作为一个接收者。
应用举例
假如,程序员负责改bug和写代码,主管负责命令程序员执行操作。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//程序员,负责改bug,写程序
class Programmer
{
public:
//改bug
void ChangeBug() { cout << "ChangeBug" << endl; }
//写程序
void WriteCode() { cout << "WriteCode" << endl; }
};
//抽象命令类
class Command
{
public:
Command(Programmer *p) { m_programmer = p; }
//执行命令
virtual void Execute() = 0;
protected:
Programmer *m_programmer;
};
//改bug命令
class BugCommand : public Command
{
public:
BugCommand(Programmer *p) : Command(p) {}
//执行改bug命令
virtual void Execute()
{
m_programmer->ChangeBug();
}
};
//写代码命令
class CodeCommand : public Command
{
public:
CodeCommand(Programmer *p) : Command(p) {}
//执行改bug命令
virtual void Execute()
{
m_programmer->WriteCode();
}
};
//主管
class Manager
{
public:
Manager(Command *command) { m_command = command; }
//通知
void Notify()
{
m_command->Execute();
}
protected:
Command *m_command;
};
int main()
{
Programmer *programmer = new Programmer;
Command *command = new BugCommand(programmer);
Manager *manager = new Manager(command);
manager->Notify();
getchar();
return 0;
}
来源:CSDN
作者:程序猿萌新
链接:https://blog.csdn.net/wzz953200463/article/details/104684515