【AHK V2】设计模式之命令模式

目录

    • 情景剧场
    • 什么是命令模式
    • 优缺点
      • 优点
      • 缺点
    • 使用命令模式的步骤
    • 命令模式代码示例
    • 合理使用AI工具自动生成代码

情景剧场

我们来设想一个场景:

你进入一家餐馆,餐馆只有老板一个人(老板即厨师)。

“老板,一份小炒肉,不要辣。”

老板收到了你的订单请求,去后厨做菜了。这时又进来几位顾客:

“老板,来两份清炒时蔬,不要辣。”

“老板,我要一份清炒时蔬,多放辣。”

“老板,一份小炒肉,多放辣,打包。”

“老板,我的两份清炒时蔬改成一份,打包。”

顾客
+点菜()
厨师
+小炒肉()
+清炒时蔬()

当顾客变多,请求也变多,而每个顾客的请求也非常不一样。老板就很容易分不清谁的需求是什么,做错菜、上错菜都是会发生的错误。顾客对老板直接提出请求,请求多了很容易导致混乱。这里顾客就是请求的发送者,老板就是请求的接收者,请求者和接收者的“紧耦合”虽然逻辑简单,但是很容易僵化。
当给餐馆加上服务员和订单,就会不一样:

顾客走进餐馆开始点单,服务员接过顾客的订单,并将其写在一张纸上。服务员去厨房,把订单贴在墙上,订单按排列顺序到达厨师手中,这样厨师做菜就不会混乱,也不会遗忘。厨师将餐点与订单一起转交服务员,服务员检查订单并将所有东西带到顾客的餐桌上。在此期间,顾客可以撤销订单或增删订单需求。

顾客
+点菜()
-取消点菜()
Order
+点菜()
-取消点菜()
小炒肉
+点菜()
-取消点菜()
清炒时蔬
+点菜()
-取消点菜()
服务员
orders : List
takeOrder()
placeOrder()
厨师
炒肉()
炒时蔬()

顾客不需要知道是谁来完成烹饪,厨师不需要知道是谁的订单,纸质订单用作命令,一直排在队列中。这也就实现了请求者和接收者的解耦。

什么是命令模式

命令模式(Command Pattern)是一种行为设计模式,它把请求或操作封装成一个包含有关请求所有信息的独立对象,此转换允许将请求作为方法参数传递,延迟或排队请求的执行,并支持可撤消的操作,从而实现将请求者和接收者解耦。

优缺点

命令模式是一种灵活且功能强大的设计模式,主要优点是它允许在不修改现有客户端代码的情况下添加新的命令。此外,通过使用命令模式,可以将操作记录到日志中、撤销操作或者将操作进行队列化等,同时他也有一些缺点。

优点

  1. 解耦性:命令模式通过将请求发送者与接收者解耦,使得请求发送者不需要知道接收者的具体实现细节,从而增强了系统的灵活性和可维护性。

  2. 可扩展性:通过添加新的具体命令类,可以很容易地扩展系统的功能,而不需要修改已有的代码。

  3. 支持撤销和重做:命令模式可以记录请求的历史操作,从而支持对操作的撤销和重做,提供了更好的用户体验。

  4. 支持日志和队列:可以将命令对象保存在日志中,实现系统的日志记录功能。此外,命令对象还可以组织成队列,实现命令的批处理和延迟执行。

  5. 命令模式符合“开-闭”原则。因为将具体命令封装成了一个一个独立的对象,所有当需要修改现有功能时,可以通过添加新代码来实现,而不是修改已有的代码。这样可以提高代码的可维护性和可扩展性,减少出错率和代码复杂度。具体点说,在增加新的具体命令或增加命令的接收者时,不需要修改原有调用者的代码;而在增加新的调用者时,不需要修改原有的具体命令和接收者的代码。

  6. 命令模式支持宏命令。

即将多个命令组合成一个命令。这样可以将多个操作封装成一个操作,减少了代码的冗余和重复,提高代码的复用率。

缺点

  1. 类的数量增加:引入命令模式会增加系统中的类的数量,特别是在有大量具体命令类的情况下,可能会导致类的数量激增,增加了系统的复杂性。
  2. 命令的单一性:每个具体命令类通常只封装了一个特定的操作,这可能会导致系统中存在大量的具体命令类,增加了系统的管理和维护成本。
  3. 对象间的调用链可能过长:在命令模式中,请求发送者、命令对象、接收者之间可能存在多层的调用链,特别是在复杂的系统中,可能会导致调用链过长,影响系统的性能。
    虽然命令模式有一些缺点,但在很多场景下仍然是一种非常有用的设计模式,特别是在需要支持撤销、重做、日志记录和队列等功能的情况下。

使用命令模式的步骤

使用命令模式可以通过以下步骤进行:

  1. 确定参与者:首先,确定在系统中谁是命令的发起者(Invoker)、命令的接收者(Receiver)、以及具体的命令对象(Command)。
  2. 定义命令接口:创建一个命令接口,其中包含一个执行操作的方法(如execute())。这个接口可以是抽象类或者接口,具体取决于设计的需求。
  3. 实现具体命令类:针对每个具体的操作,创建一个具体的命令类,实现命令接口,并在其中封装具体的操作实现。
  4. 创建接收者类:定义接收者类,实现命令所需的具体操作。 创建调用者类:创建一个调用者类,负责向具体的命令对象发送请求。
  5. 创建客户端代码:在客户端代码中创建具体的命令对象,并将其关联到调用者对象上。

命令模式代码示例

; 定义命令接口
class ICommand {Execute() {; 需要被覆盖的方法(抽象方法)}
}; 定义具体命令A
class CommandA extends ICommand {Execute() {MsgBox("Command A Executed")}
}; 定义具体命令B
class CommandB extends ICommand {Execute() {MsgBox("Command B Executed")}
}; 定义调用者,负责执行命令
class Invoker {__New(command) {this.command := command}ExecuteCommand() {this.command.Execute()}
}; 客户端代码
main() {; 创建命令实例_commandA := CommandA()_commandB := CommandB(); 创建调用者并关联命令_invokerA := Invoker(_commandA)_invokerB := Invoker(_commandB); 执行命令_invokerA.ExecuteCommand()_invokerB.ExecuteCommand()
}; 运行主程序
main()

合理使用AI工具自动生成代码

上面的代码是用Comate生成的
在这里插入图片描述
代码就是上面那部分,我就不截图了,稍微改改就可以运行。也可以把报错信息提示给它,它会给出修改代码示例。

还可以让它输出UML类图:
在这里插入图片描述
这个mermaid代码直接在CSDN的波纹MD编辑模式可以直接用哦。

感兴趣可以在VSCODE中安装这个AI编码助手——Comate,感觉能在小众语言AHK上表现这么好还是很令人惊讶的。
https://comate.baidu.com/zh/shopping?inviteCode=kqqi3lsj

Alt

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

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

相关文章

Vue插槽solt如何传递具名插槽的数据给子组件?

在Vue中,你可以通过作用域插槽(scoped slots)来传递数据给子组件。这同样适用于具名插槽。首先,你需要在子组件中定义一个具名插槽,并通过v-slot指令传递数据。例如: 子组件(ChildComponent.vu…

自用RedisConfig的配置,更改key为string和value json的序列化,避免set乱的key

自用RedisConfig的配置,更改key为string和value json的序列化,避免set乱的key,使用StringRedisTemplate也可以解决,保证了redis set的值是正确的 Configuration public class RedisConfig {//更改key为string和value json的序列化…

吃透1850道真题和解析备考AMC8和AMC(1020240524持续发布)

多做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一,通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。 今天我们继续…

在新cloud上启动备份数据库

情况介绍:在云上划拉一块地方建立本地数据库测试环境,通过数据库备份包恢复数据并启动。 1.在云上或者你自己的server上安装Percona Server for MySQL,步骤如下 Use APT repositories - Percona Server for MySQL How to Install or Upgra…

java实现List对象转geojson文本返回前端

1.业务需求 查询带有经纬度数据的list列表,将其转为geojson格式给前端。 2.GeoJson格式说明 GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法(JavaScript Object Notation, 简称JSON)的地理空间信息数据交换格式。GeoJSON对…

计算机系统的层次结构

操作系统的定义 操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基…

GBase 8s 如何查看回滚的事务 和对应的SQL

描述: 如何查看当前数据库中是否有事务在回滚, 如果有, 具体是哪条 SQL 在回滚? 解决办法: 方法1: 通过 onstat -u|grep RP; 可以获取相关的 sessionid。 通过 onstat -g ses sid 获取 SQL&a…

【多模态融合】Cross Modal Transformer: Towards Fast and Robust 3D Object Detection

论文链接:Cross Modal Transformer: Towards Fast and Robust 3D Object Detection 代码链接:https://github.com/junjie18/CMT 作者:Junjie Yan, Yingfei Liu, Jianjian Sun, Fan Jia, Shuailin Li, Tiancai Wang, Xiangyu Zhang 发表单位…

字符串的周期:每一期都有那么几位

【题目描述】 如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例 如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。 输入一个长度不超过80的字符串(不含空格),输出其最小周期。 输入第一行表示有T组数据,后续是T行字符串。输出的每组…

性能测试工具

性能测试工具 1.Jmeter 环境搭建1.安装JDK2.安装Jmeter1.下载2.安装3.环境配置 3.Jmeter 文件目录介绍1.bin目录2.docs 目录3.printable_docs目录4.lib目录 4.修改默认配置1.汉化配置2.修改主题 5.元件的基本介绍6.元件的作用域作用域的原则 7.元件的执行顺序 1.Jmeter 环境搭建…

Linux基础-目录命令

目录文件命令 一、概述二、文件目录1. 目录信息1. pwd:显示当前目录2. cd :切换目录3. ls:显示目录中的文件信息 2. 操作目录1. mkdir : 创建目录2. rm : 删除目录3. mv : 移动、重命名目录4. cp :拷贝命令 一、概述 这里记录一下…

【Pytorch】16.使用ImageFolder加载自定义MNIST数据集训练手写数字识别网络(包含数据集下载)

数据集下载 MINST_PNG_Training在github的项目目录中的datasets中有MNIST的png格式数据集的压缩包 用于训练的神经网络模型 自定义数据集训练 在前文【Pytorch】13.搭建完整的CIFAR10模型我们已经知道了基本搭建神经网络的框架了,但是其中的数据集使用的torchvision…

Flutter 中的 WidgetInspector 小部件:全面指南

Flutter 中的 WidgetInspector 小部件:全面指南 Flutter 的 WidgetInspector 是一个强大的工具,它允许开发者在运行时检查和操作他们的 widget 树。这在调试复杂的布局和 widget 结构时尤其有用。本文将为您提供一个全面的指南,帮助您了解如…

Excel 按顺序去重再编号

Excel的A有重复数据: A1Cow2Chicken3Horse4Butterfly5Cow 现在要去除重复,用自然数按顺序进行编号,结果写在相邻列: AB1Cow12Chicken23Horse34Butterfly45Cow1 使用 SPL XLL,输入公式并向下拖: spl(&q…

RISC-V压缩指令扩展测试

概述 RISC-V定义了压缩指令扩展(compressed instruction-set extension ),命名为“C”扩展。压缩指令使用16位宽指令替换32位宽指令,从而减少代码量。这个C扩展可运用在RV32、RV64和RV128指令集上,通常使用“RVC”来表…

Double 4 VR情景实训教学系统在商务洽谈课堂上的应用

随着科技的不断发展,VR(虚拟现实)技术已经逐渐渗透到各个领域。在商务洽谈课堂上,Double 4 VR情景实训教学系统不仅可以为学生提供身临其境的模拟环境,还可以通过互动和交互式学习方式,增强学生的学习体验和…

贝锐向日葵打造农机设备远程运维支持方案

当物联网“万物互联”的概念向第一产业赋能,农机设备的智能化程度也越来越高。 所谓农业物联网,即在应用层将大量的传感器节点构成监控网络,通过各种传感器采集信息,以帮助农民及时发现问题,并准确地判定发生问题的位…

QT 使用QZipReader 进行文件解压缩

目录 1、QZipReader 概述 2、解压示例 3、说明 1、QZipReader 概述 QZipReader 是一个方便的工具,用于在 Qt 应用程序中解压 ZIP 压缩包。它提供了读取 ZIP 文件的接口,并能提取其中的内容。以下是如何使用 QZipReader 解压 ZIP 文件的示例代码&#…

List、IList、ArrayList 和 Dictionary

List 类型: 泛型类命名空间: System.Collections.Generic作用: List<T> 表示一个强类型的对象列表&#xff0c;可以通过索引访问。提供了搜索、排序和操作列表的方法。特点: 类型安全&#xff0c;性能较好&#xff0c;适用于需要强类型和高效操作的场景。例子: List<…

每日一练 - BGP Keepalive 报文详解

01 真题题目 关于 BGP 的 Keepalive 报文消息的描述,错误的是&#xff1a; A.Keepalive 周期性的在两个 BGP 邻居之间发送 B.缺省情况下,Keepalive 的时间间隔是 180s C.Keepalive 报文主要用于对等路由器间的运行状态和链路的可用性确认 D.Keepalive 报文的组成只包含一个…