设计模式(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

相关文章

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

使用mvn deploy命令上传jar包的实现

《使用mvndeploy命令上传jar包的实现》本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学... 目录一、背景二、环境三、配置nexus上传账号四、执行deploy命令上传包1. 首先需要把本地仓中要