23种设计模式 3 行为型模式 之3.7 command 命令模式

参考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,

咋们是不是用了多了,就会出现这个新单词

相关推荐
灰子学技术4 小时前
Envoy 使用的设计模式技术文档
设计模式
Carl_奕然14 小时前
【智能体】Agent的四种设计模式之:ReAct
人工智能·设计模式·语言模型
二哈赛车手15 小时前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
楼田莉子16 小时前
仿Muduo的高并发服务器:Channel模块与Poller模块
linux·服务器·c++·学习·设计模式
geovindu1 天前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
嵌入式学习_force2 天前
02_state
设计模式·蓝牙
qcx232 天前
Warp源码深度解析(七):Token预算策略——双轨计费、上下文溢出与摘要压缩
人工智能·设计模式·rust·wrap
Cosolar2 天前
提示词工程面试题系列 - Zero-Shot Prompting 和 Few-Shot Prompting 的核心区别是什么?
人工智能·设计模式·架构
geovindu3 天前
go:Template Method Pattern
开发语言·后端·设计模式·golang·模板方法模式
钝挫力PROGRAMER3 天前
贫血模型的改进
java·开发语言·设计模式·架构