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,

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

相关推荐
一条闲鱼_mytube3 小时前
智能体设计模式(二)反思-工具使用-规划
网络·人工智能·设计模式
老蒋每日coding4 小时前
AI智能体设计模式系列(七)—— 多 Agent 协作模式
设计模式
小码过河.6 小时前
设计模式——代理模式
设计模式·代理模式
Engineer邓祥浩7 小时前
设计模式学习(14) 23-12 代理模式
学习·设计模式·代理模式
小码过河.7 小时前
设计模式——单例模式
单例模式·设计模式
dxnb227 小时前
Datawhale26年1月组队学习:Agentic AI+Task2反思设计模式
学习·设计模式
老蒋每日coding7 小时前
AI智能体设计模式系列(八)—— 记忆管理模式
人工智能·设计模式·golang
Mr YiRan8 小时前
重学设计模式之拦截器和责任链
设计模式
小码过河.8 小时前
设计模式——享元模式
java·设计模式·享元模式