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,

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

相关推荐
触底反弹1 小时前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试
杨充1 天前
10.可测试性实战设计
设计模式·开源·代码规范
杨充1 天前
9.重构十二式的实战
设计模式·开源·代码规范
杨充1 天前
6.设计原则的全景图
设计模式·开源·全栈
杨充1 天前
2.面向对象的特性
设计模式
杨充1 天前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充1 天前
8.反模式与坏味道
设计模式·开源·代码规范
杨充1 天前
3.接口vs抽象类比较
设计模式
咖啡八杯1 天前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法