小谈设计模式(24)—命令模式

小谈设计模式(24)—命令模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 命令模式
    • 角色分析
      • 命令(Command)
      • 具体命令(ConcreteCommand)
      • 接收者(Receiver)
      • 调用者(Invoker)
      • 客户端(Client)
    • 工作流程
      • 1
      • 2
      • 3
    • Java程序实现
      • 分析
      • 输出结果
    • 优缺点分析
      • 优点
        • 解耦调用者和接收者
        • 支持请求的排队和记录
        • 支持撤销操作
        • 可扩展性强
      • 缺点
        • 类的数量增加
        • 命令的执行效率
        • 可能引入额外的复杂性
      • 总结

专栏介绍

专栏地址

http://t.csdnimg.cn/VpriY

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

命令模式

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使得可以用不同的请求对客户进行参数化,同时支持请求的排队、记录请求日志、撤销操作等

在这里插入图片描述

角色分析

命令(Command)

定义了执行操作的接口,通常包含一个execute()方法,用于执行相关操作。

具体命令(ConcreteCommand)

实现了命令接口,具体定义了执行操作的具体逻辑。

接收者(Receiver)

执行命令所要求的操作,是具体命令对象的业务处理对象。

调用者(Invoker)

负责调用命令对象执行请求,通常会持有命令对象的引用。

客户端(Client)

创建具体命令对象,并设置命令对象的接收者。

在这里插入图片描述

工作流程

1

客户端创建具体命令对象,并设置命令对象的接收者。

2

调用者持有具体命令对象的引用,并调用命令对象的execute()方法。

3

具体命令对象执行相关操作,并将请求传递给接收者进行处理。
在这里插入图片描述

Java程序实现

// 定义命令接口
public interface Command {void execute();
}// 定义具体命令类
public class ConcreteCommand implements Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}public void execute() {receiver.action();}
}// 定义接收者类
public class Receiver {public void action() {System.out.println("接收者执行操作");}
}// 定义调用者类
public class Invoker {private Command command;public void setCommand(Command command) {this.command = command;}public void executeCommand() {command.execute();}
}// 客户端代码
public class Client {public static void main(String[] args) {// 创建接收者对象Receiver receiver = new Receiver();// 创建具体命令对象,并传入接收者对象Command command = new ConcreteCommand(receiver);// 创建调用者对象,并设置具体命令对象Invoker invoker = new Invoker();invoker.setCommand(command);// 调用者执行命令invoker.executeCommand();}
}

在这里插入图片描述

分析

在上面的示例中,定义了一个命令接口 Command,具体命令类 ConcreteCommand 实现了该接口,并在 execute() 方法中调用接收者对象的操作方法。

接收者类 Receiver 定义了具体的操作方法 action()。

调用者类 Invoker 持有一个命令对象,并提供了 setCommand() 方法来设置具体的命令对象,以及 executeCommand() 方法来执行命令。

在客户端代码中,创建了接收者对象、具体命令对象和调用者对象,并设置具体命令对象到调用者对象中,最后调用调用者对象的 executeCommand() 方法来执行命令。

输出结果

···
接收者执行操作
···

优缺点分析

优点

解耦调用者和接收者

命令模式将请求封装成一个对象,使得调用者不需要知道接收者的具体实现,只需要通过命令对象来执行请求。这样可以降低调用者和接收者之间的耦合度,提高系统的灵活性和可维护性。

支持请求的排队和记录

命令模式可以将多个命令对象放入队列中,按照一定的顺序执行。这样可以实现请求的排队和调度,也可以记录请求日志,方便后续操作和追踪。

支持撤销操作

命令模式可以保存命令对象的状态,从而支持撤销操作。通过保存命令对象的历史状态,可以实现撤销和恢复操作,提供更好的用户体验。

可扩展性强

命令模式可以通过新增具体命令类来扩展系统的功能,而不需要修改现有的代码。这样可以保持系统的稳定性,同时也方便了系统的维护和升级。

缺点

类的数量增加

引入命令模式会增加系统中的类的数量,每个具体命令类都需要实现命令接口。这样可能会增加系统的复杂性,降低代码的可读性。

命令的执行效率

由于命令模式需要将请求封装成对象,并通过调用者来执行,因此相比直接调用接收者的方法,命令模式的执行效率可能会稍低。

可能引入额外的复杂性

命令模式需要设计和管理命令对象、调用者、接收者等多个角色,可能会引入额外的复杂性。尤其是在处理多个命令对象之间的协作和交互时,需要仔细设计和管理。

总结

命令模式在需要将请求封装成对象、支持请求的排队、记录请求日志、撤销操作等场景下非常有用。但在一些简单的场景下,引入命令模式可能会增加系统的复杂性,需要权衡使用。

在这里插入图片描述

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=23dxmu32qt8gs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/104670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生物制剂\化工\化妆品等质检损耗、制造误差处理作业流程图(ODOO15/16)

生物制剂、化工、化妆品等行业,因为产品为液体,产品形态和质量容易在各个业务环节发生变化,常常导致实物和账面数据不一致,如果企业业务流程不清晰,会导致系统大量的库存差异,以及财务难以核算的问题&#…

ROS为机器人装配激光雷达

移动机器人在环境中获取障碍物的具体位置、房间的内部轮廓等信息都是非常必要的,这些信息是机器人创建地图、进行导航的基础数据,除上面所讲的Kinect,还可以使用激光雷达作为这种场景应用下的传感器。 激光雷达可用于测量机器人和其他物体之间…

python爬取boss直聘数据(selenium+xpath)

文章目录 一、主要目标二、开发环境三、selenium安装和驱动下载四、主要思路五、代码展示和说明1、导入相关库2、启动浏览器3、搜索框定位创建csv文件招聘页面数据解析(XPATH)总代码效果展示 六、总结 一、主要目标 以boss直聘为目标网站,主要目的是爬取下图中的所…

软件TFN 2K的分布式拒绝攻击(DDos)实战详解

写在前头 本人写这篇博客的目的,并不是我想成为黑客或者鼓励大家做损坏任何人安全和利益的事情。因科研需要,我学习软件TFN 2K的分布式拒绝攻击,只是分享自己的学习过程和经历,有助于大家更好的关注到网络安全及网络维护上。 需要…

JavaScript(CSS)动画引擎汇总

汇总记录前端实现动画相关的库 1、animejs animejs是一个轻量级的JavaScript动画库,具有简单但功能强大的API。 它适用于CSS属性,SVG,DOM属性和JavaScript对象。 官网anime.js • JavaScript animation engine anime.js - a Collection by…

小华HC32F448串口使用

目录 1. 串口GPIO配置 2. 串口波特率配置 3. 串口接收超时配置 4. 串口中断注册 5. 串口初始化 6. 串口数据接收处理 7. DMA接收配置和处理 1. 串口GPIO配置 端口号和Pin脚号跟STM32没什么区别。 串口复用功能跟STM32大不一样。 如下图,选自HC32F448 表 2…

CodeForces每日好题10.14

给你一个字符串 让你删除一些字符让它变成一个相邻的字母不相同的字符串,问你最小的删除次数 以及你可以完成的所有方/案数 求方案数往DP 或者 组合数学推公式上面去想,发现一个有意思的事情 例如1001011110 这个字符串你划分成1 00 1 0 1111 0 每…

超低延时 TCP/UDP IP核

实现以太网协议集当中的ARP、ICMP、UDP以及TCP协议 一、概述 TCP_IP核是公司自主开发的使用FPGA逻辑搭建的用于10G以太网通信IP。该IP能够实现以太网协议集当中的ARP、ICMP、UDP以及TCP协议。支持连接10G/25G以太网PHY,组成高速网络通信系统。该IP上传、下传数据B…

极简的MapReduce实现

目录 1. MapReduce概述 2. 极简MapReduce内存版 3. 复杂MapReduce磁盘版 4. MapReduce思想的总结 1. MapReduce概述 以前写过一篇 MapReduce思想 ,这次再深入一点,简单实现一把单机内存的。MapReduce就是把它理解成高阶函数,需要传入map和…

【Candence报错】Discrepancy #i in TASK

问题描述 Candence LVS仿真提示网络不匹配 问题解决 检查原理图和Layout 注意:

css 星星闪烁加载框

今天带来的是普灵普灵的loader闪烁加载框 效果如下 开源精神给我们带来了源码 ,源码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

SpringMVC的请求处理

请求映射路径的配置 请求映射路径的配置主要是通过RequestMapping注解实现的 相关注解作用使用位置RequestMapping设置控制器方法访问路径的资源&#xff0c;可以接收任何请求方法和类上GetMapping设置控制器方法访问路径的资源&#xff0c;可接收GET请求方法和类上PostMappin…

Step 1 搭建一个简单的渲染框架

Step 1 搭建一个简单的渲染框架 万事开头难。从萌生到自己到处看源码手抄一个mini engine出来的想法&#xff0c;到真正敲键盘去抄&#xff0c;转眼过去了很久的时间。这次大概的确是抱着认真的想法&#xff0c;打开VS从零开始抄代码。不知道能坚持多久呢。。。 本次的主题是搭…

idea(添加jsp文件模板)

初始jsp模板代码&#xff1a; <%-- Created by IntelliJ IDEA. User: ${USER} Date: ${DATE} Time: ${TIME} To change this template use File | Settings | File Templates. --%> <% page contentType"text/html;charsetUTF-8" language&q…

局域网上IP多播与IP单播关于MAC地址的区别

IP单播进行到局域网上的时候&#xff1a; 网际层使用IP地址进行寻址&#xff0c;各路由器收到IP数据报后&#xff0c;根据其首部中的目的IP地址的网络号部分&#xff0c;基于路由表进行查表转发。 查表转发的结果可指明IP数据报的下一跳路由器的IP地址&#xff0c;但无法指明…

SpringCloud小项目——订单积分商城 使用Nacos、Open Feign、Gateway、Sentinel技术栈

目录 引出小项目要求创建极简数据库表订单表&#xff0c;订单明细表商品表积分表 相关微服务积分微服务产品微服务订单微服务调用积分和订单微服务 网关微服务登陆认证通过网关实现对外提供接口API走网关功能 sentinel相关使用Sentinel限流&#xff0c;流量整形Sentinel降级服务…

Python正则表达式

正则表达式 当处理文本数据时&#xff0c;正则表达式是一种强大的工具&#xff0c;它允许我们根据特定的模式来匹配、搜索和处理字符串。 正则表达式由一系列字符和特殊字符组成&#xff0c;用于描述文本模式。这些模式可以包含普通字符&#xff08;如字母、数字和标点符号&a…

kafka 开启认证授权

前言 1、前面自己写了一篇关于各个环境各个模式的安装的文章&#xff0c;大家可以去看看 kafka各种环境安装(window,linux,docker,k8s),包含KRaft模式 2、使用版本 kafka_2.13-3.4.1 3、kafka验证方式&#xff0c;有两大类如下&#xff0c;文档内容在 kafka官方文档的 第七节…

蓝桥杯每日一题2023.10.14

年号字串 - 蓝桥云课 (lanqiao.cn) 题目描述 我们发现每个字母都与26紧密相关&#xff0c;其%26的位置就是最后一个字母&#xff0c;由于最开始将0做为了1故在写答案时需要注意细节问题 #include<bits/stdc.h> using namespace std; char s[] "ABCDEFGHIJKLMNOPQ…

编译linux的设备树

使用make dtbs命令时 在arch/arm 的目录Makefile文件中有 boot : arch/arm/boot prepare 和scripts是空的 在文件scripts/Kbuild.include中 变量build : -f $(srctree)/scripts/Makefile.build obj 在顶层Makefile中 $(srctree)&#xff1a;. 展开后-f ./scripts/Mak…