参考1 网友k_eckel 的书籍《设计模式精讲-GoF 23种设计模式解析附C++实现源码》
参考2 腾讯元宝 & vscode copilot 问答
23种设计模式 3 行为型模式 之3.7 command 命令模式
- [0 前言](#0 前言)
- [1 问题](#1 问题)
- [2 模式选择](#2 模式选择)
- [3 实现](#3 实现)
-
- [3.1 reciever.h](#3.1 reciever.h)
- [3.2 reciever.cpp](#3.2 reciever.cpp)
- [3.3 command.h](#3.3 command.h)
- [3.4 command.cpp](#3.4 command.cpp)
- [3.5 invoker.h](#3.5 invoker.h)
- [3.6 invoker.cpp](#3.6 invoker.cpp)
- [3.7 main.cpp](#3.7 main.cpp)
- [3.8 原作者对代码说明](#3.8 原作者对代码说明)
-
- [3.8.1 补充的另外部分(抽象receiver,集成invoker )](#3.8.1 补充的另外部分(抽象receiver,集成invoker ))
-
- [3.8.1.1 reciever.h&receiver](#3.8.1.1 reciever.h&receiver)
- [3.8.1.2 reciever&receiver.cpp](#3.8.1.2 reciever&receiver.cpp)
- [3.8.1.3 abstract_command.h](#3.8.1.3 abstract_command.h)
- [3.8.1.4 main.cpp](#3.8.1.4 main.cpp)
- [3.8.1.5 运行结果](#3.8.1.5 运行结果)
-
- [3.8.1.6 ai对于这种代码的优点说明](#3.8.1.6 ai对于这种代码的优点说明)
- [4 讨论](#4 讨论)
- [5 总结](#5 总结)
-
- [5.1 扩展](#5.1 扩展)
-
- [5.1.1 抽象invoker 和 reciever](#5.1.1 抽象invoker 和 reciever)
- [5.1.2 command 模式与 mediator 模式结合来使用,支持取消操作](#5.1.2 command 模式与 mediator 模式结合来使用,支持取消操作)
- [6 巴卡巴卡哇卡哇卡](#6 巴卡巴卡哇卡哇卡)
0 前言
command 模式,命令模式。
可以先看看小节6中的说明
1 问题
command 模式通过将请求封装到一个对象(command)中,并将请求的接受者放到具体的concrete_command类中(receiver)中,从而实现调用操作的对象和操作的具体实现者之间的解耦。
2 模式选择
依赖
关联
聚合
继承
关联
Client
- main()
Invoker
- command: Command
- Invoke()
<<abstract>>
Command - Execute()
ConcreteCommand
- receiver: Receiver
- Execute()
Receiver - Action()


3 实现
3.1 reciever.h
cpp
#ifndef __RECIEVER_H_
#define __RECIEVER_H_
class reciever
{
public:
reciever();
~reciever();
void action();
protected:
private:
};
#endif //~~__RECIVER_H_
3.2 reciever.cpp
cpp
#include "reciever.h"
#include <iostream>
reciever::reciever()
{
}
reciever::~reciever()
{
}
void reciever::action()
{
std::cout << "reciever action......" << std::endl;
}
3.3 command.h
cpp
#ifndef __COMMAND_H_
#define __COMMAND_H_
class reciever;
class command
{
public:
virtual ~command();
virtual void excute() = 0;
protected:
command();
private:
};
class concrete_command:public command
{
public:
concrete_command(reciever* rev);
~concrete_command();
void excute();
protected:
private:
reciever* _rev;
};
#endif //~~__COMMAND_H_
3.4 command.cpp
cpp
#include "command.h"
#include "reciever.h"
#include <iostream>
command::command()
{
}
command::~command()
{
}
void command::excute()
{
}
concrete_command::concrete_command(reciever* rev)
{
this->_rev = rev;
}
concrete_command::~concrete_command()
{
delete this->_rev;
}
void concrete_command::excute()
{
_rev->action();
std::cout << "concrete_command..." << std::endl;
}
3.5 invoker.h
cpp
#ifndef __INVOKER_H_
#define __INVOKER_H_
class command;
class invoker
{
public:
invoker(command* cmd);
~invoker();
void invoke();
protected:
private:
command* _cmd;
};
#endif //~~__INVOKER_H_
3.6 invoker.cpp
cpp
#include "invoker.h"
#include "command.h"
#include <iostream>
invoker::invoker(command* cmd)
{
_cmd = cmd;
}
invoker::~invoker()
{
delete _cmd;
}
void invoker::invoke()
{
_cmd->excute();
}
3.7 main.cpp
cpp
#include "command.h"
#include "invoker.h"
#include "reciever.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
reciever* rev = new reciever();
command* cmd = new concrete_command(rev);
invoker* inv = new invoker(cmd);
inv->invoke();
return 0;
}
运行结果

3.8 原作者对代码说明

3.8.1 补充的另外部分(抽象receiver,集成invoker )
将invoker和receiver 的处理抽象出来,
将receiver和方法作为参数传递给command;
command使用excute集成invoker的职能;
3.8.1.1 reciever.h&receiver
cpp
#ifndef __RECEIVER_H_
#define __RECEIVER_H_
class reciever
{
public:
reciever();
~reciever();
void action();
protected:
private:
};
#endif
3.8.1.2 reciever&receiver.cpp
cpp
#include "reciever.h"
#include <iostream>
reciever::reciever()
{
}
reciever::~reciever()
{
}
void reciever::action()
{
std::cout << "reciever action......" << std::endl;
}
3.8.1.3 abstract_command.h
cpp
#ifndef __ABSTRACT_COMMAND_H_
#define __ABSTRACT_COMMAND_H_
#include "../command.h"
template <class reciever>
class simple_command:public command
{
public:
typedef void (reciever::* action)();
simple_command(reciever* rev, action act)
{
_rev = rev;
_act = act;
}
virtual void excute()
{
(_rev->* _act)();
}
~simple_command()
{
delete _rev;
}
protected:
private:
reciever* _rev;
action _act;
};
#endif //~~__ABSTRACT_COMMAND_H_
3.8.1.4 main.cpp
cpp
#include "abstract_command.h"
#include "reciever.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
reciever* rev = new reciever();
command* cmd = new simple_command<reciever>(rev, &reciever::action);
cmd->excute();
return 0;
}
3.8.1.5 运行结果
运行结果

3.8.1.6 ai对于这种代码的优点说明

4 讨论
原作者内容

5 总结
command模式(命令模式)解决的问题:命令在调用者和执行者之间解耦。
这里实现的方式:
采用封装的调用链的方式:invoker -> cmd - > reciever(action)
类生成:
5.1 扩展
5.1.1 抽象invoker 和 reciever
这里,作者扩展讲了下invoker 和 reciever的抽象。将invoker集成到command ; reciever接受者抽象出来,作为参数传递给command对象;
实际也就是回调机制来实现这一点。
5.1.2 command 模式与 mediator 模式结合来使用,支持取消操作
这里暂时不写了
6 巴卡巴卡哇卡哇卡
reciever 和 receiver,在网上搜了下,
不存在reciever这个单词;
ai说是拼写错误,应该写成receiver;
但看见很多博客代码,采用的reciever,
咋们是不是用了多了,就会出现这个新单词