设计模式(016)行为型之命令模式

2024-04-11 05:04

本文主要是介绍设计模式(016)行为型之命令模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        命令模式,它将请求封装成一个对象,从而允许客户端参数化操作队列、记录请求日志、支持撤销操作等。在命令模式中,有四个核心角色:命令接口(Command)、具体命令(ConcreteCommand)、调用者(Invoker)、接收者(Receiver)。
① 命令接口(Command):声明了执行命令的方法,是命令对象的抽象表示。
② 具体命令(ConcreteCommand):实现了命令接口,具体定义了要执行的操作。
③ 调用者(Invoker):负责调用命令对象执行请求,它并不知道具体的命令细节,只知道调用命令对象的方法来完成请求。
④ 接收者(Receiver):负责实际执行命令指定的操作。
命令模式的核心思想是将请求的发送者与请求的接收者解耦,通过命令对象将二者进行绑定。这样可以实现对请求的封装、记录、排队和撤销操作等功能

1、场景设计

实现场景:请求者发出命令,接收者接收命令并执行一个动作。

2、C++实现

`Command` 是命令接口,定义了一个纯虚的 `execute()` 方法。`ConcreteCommand` 是具体命令,实现了 `Command` 接口,并在 `execute()` 方法中调用了接收者的 `action()` 方法。`Receiver` 是接收者,负责实际执行命令指定的操作。`Invoker` 是调用者,负责维护一系列命令,并负责调用这些命令执行请求。在 `main()` 函数中,我们创建了一个接收者、一个具体命令和一个调用者,并将具体命令添加到调用者中执行。

#include <iostream>
#include <vector>// 命令接口
class Command {public:virtual void execute() = 0;
};// 接收者
class Receiver {public:void action() {std::cout << "Receiver: Executing action" << std::endl;}
};// 具体命令
class ConcreteCommand : public Command {private:class Receiver *receiver;public:ConcreteCommand(class Receiver *recv) : receiver(recv) {}void execute() override {receiver->action();}
};// 调用者
class Invoker {private:std::vector<Command *> commands;public:void addCommand(Command *cmd) {commands.push_back(cmd);}void executeCommands() {for (Command *cmd : commands) {cmd->execute();}commands.clear();}
};int main() {Receiver *receiver = new Receiver();Command *command = new ConcreteCommand(receiver);Invoker *invoker = new Invoker();invoker->addCommand(command);invoker->executeCommands();delete receiver;delete command;delete invoker;return 0;
}

3、Java实现

`Command` 是命令接口,定义了一个 `execute()` 方法。`ConcreteCommand` 是具体命令,实现了 `Command` 接口,并在 `execute()` 方法中调用了接收者的 `action()` 方法。`Receiver` 是接收者,负责实际执行命令指定的操作。`Invoker` 是调用者,负责调用命令对象执行请求。在 `main()` 方法中,我们创建了一个接收者、一个具体命令和一个调用者,并将具体命令绑定到调用者上执行。

package behavioralpattern.command;public class CommandDemo {// 命令接口interface Command {void execute();}// 具体命令static class ConcreteCommand implements Command {private Receiver receiver;ConcreteCommand(Receiver receiver) {this.receiver = receiver;}@Overridepublic void execute() {receiver.action();}}// 接收者static class Receiver {void action() {System.out.println("Receiver: Executing action");}}// 调用者static class Invoker {private Command command;void setCommand(Command command) {this.command = command;}void executeCommand() {command.execute();}}public static void main(String[] args) {Receiver receiver = new Receiver();Command command = new ConcreteCommand(receiver);Invoker invoker = new Invoker();invoker.setCommand(command);invoker.executeCommand();}
}

这篇关于设计模式(016)行为型之命令模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/893142

相关文章

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

CentOS系统使用yum命令报错问题及解决

《CentOS系统使用yum命令报错问题及解决》文章主要讲述了在CentOS系统中使用yum命令时遇到的错误,并提供了个人解决方法,希望对大家有所帮助,并鼓励大家支持脚本之家... 目录Centos系统使用yum命令报错找到文件替换源文件为总结CentOS系统使用yum命令报错http://www.cppc