GPT带我学-设计模式-命令模式
1 你知道设计模式的命令模式吗
是的,我知道设计模式中的命令模式。命令模式是一种行为型设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或日志来参数化其他对象。命令模式还支持撤销操作,并且可以提供事务的实现。
在命令模式中,有四个主要的参与对象:命令接口(Command)、具体命令(ConcreteCommand)、命令发起者(Invoker)和命令执行者(Receiver)。命令接口充当了命令的抽象,并声明了执行命令的方法。具体命令实现了命令接口,并具体实现了命令的执行逻辑。命令发起者持有一个命令对象,并可以调用命令对象的执行方法,从而触发命令的执行。命令执行者实际执行命令的操作。
命令模式的优点包括:解耦命令发起者和命令执行者、简化命令的撤销和重做、支持事务等。它可以帮助我们将请求和执行解耦,并且可以提供更好的灵活性和可扩展性。
2 命令模式有几种形式
命令模式主要有三种形式:简单命令模式、宏命令模式和撤销操作命令模式。
简单命令模式(Simple Command Pattern):简单命令模式是命令模式最基本的形式。它只包含一个命令接口和多个具体命令类。每个具体命令类都实现了命令接口,并实现了自己的执行逻辑。命令发起者只需要持有一个命令接口的引用,并通过调用命令接口的方法来触发命令的执行。
宏命令模式(Macro Command Pattern):宏命令模式将多个命令封装为一个宏命令,从而实现一次性执行多个命令。宏命令本身也是一个具体命令,它持有多个其他具体命令的引用,并在执行时依次调用这些命令的执行方法。宏命令模式可以将多个原子操作组合成一个更高级的操作。
撤销操作命令模式(Undo Command Pattern):撤销操作命令模式在简单命令模式的基础上加入了撤销操作的支持。每个具体命令类都需要提供一个撤销方法,在调用撤销方法时可以回滚该命令的执行。撤销操作命令模式可以用于实现撤销和重做功能,使得用户可以取消一系列操作的执行。
这些形式不是互斥的,可以根据具体的需求和场景选择适合的命令模式形式。
3 请你用java写一个简单命令模式具体的例子
当然可以!下面是一个简单的Java代码示例,演示了简单命令模式的实现:
// 定义命令接口
interface Command {void execute();
}// 具体命令类
class ConcreteCommand implements Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}// 实现命令接口的执行方法public void execute() {receiver.action();}
}// 接收者类
class Receiver {public void action() {System.out.println("Receiver执行命令!");}
}// 命令发起者类
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接口定义了命令的执行方法execute()。具体命令类ConcreteCommand实现了Command接口,并在execute()方法中调用了接收者对象的action()方法执行具体的命令操作。命令发起者类Invoker持有一个Command对象,并在executeCommand()方法中调用命令对象的execute()方法来触发命令的执行。
运行以上代码,输出结果为:
Receiver执行命令!
这表明成功执行了命令模式,命令发起者通过调用命令对象的方法,将命令传递给接收者并执行了相关操作。
4 你这个例子还是太抽象了,请举一个生活中具体的例子
当然!让我们来看一个更具生活化的例子——简单命令模式在餐厅点餐系统中的应用。
首先,我们定义一个命令接口Order,其中包含了一个执行命令的方法execute():
public interface Order {void execute();
}
然后,我们实现具体的命令类,比如CookOrder、ServeOrder和CancelOrder:
public class CookOrder implements Order {private Chef chef;public CookOrder(Chef chef) {this.chef = chef;}public void execute() {chef.cook();}
}public class ServeOrder implements Order {private Waiter waiter;public ServeOrder(Waiter waiter) {this.waiter = waiter;}public void execute() {waiter.serve();}
}public class CancelOrder implements Order {private Cashier cashier;public CancelOrder(Cashier cashier) {this.cashier = cashier;}public void execute() {cashier.cancel();}
}
在这个例子中,CookOrder是具体的烹饪命令,ServeOrder是具体的上菜命令,CancelOrder是具体的取消订单命令。
接下来,我们定义几个接收者类,比如Chef、Waiter和Cashier,它们都具有相应的操作:
public class Chef {public void cook() {System.out.println("厨师正在烹饪订单...");}
}public class Waiter {public void serve() {System.out.println("服务员正在上菜...");}
}public class Cashier {public void cancel() {System.out.println("收银员正在取消订单...");}
}
最后,我们定义命令发起者类OrderInvoker,它持有一个Order对象,并在调用execute()方法时触发命令的执行:
public class OrderInvoker {private Order order;public OrderInvoker(Order order) {this.order = order;}public void executeOrder() {order.execute();}
}
现在,我们可以使用上述类来模拟餐厅点餐的场景。例如,在点餐系统中,当一个顾客确定要点餐后,服务员会将顾客的订单交给厨师,并通知收银员进行结算
public class RestaurantClient {public static void main(String[] args) {Chef chef = new Chef();Waiter waiter = new Waiter();Cashier cashier = new Cashier();Order cookOrder = new CookOrder(chef);Order serveOrder = new ServeOrder(waiter);Order cancelOrder = new CancelOrder(cashier);OrderInvoker invoker = new OrderInvoker(cookOrder);invoker.executeOrder();invoker = new OrderInvoker(serveOrder);invoker.executeOrder();invoker = new OrderInvoker(cancelOrder);invoker.executeOrder();}
}
当我们运行以上代码时,控制台将会输出:
厨师正在烹饪订单...
服务员正在上菜...
收银员正在取消订单...
这个例子中,顾客点餐后,服务员将不同的订单给相应的接收者(厨师、服务员和收银员),通过简单命令模式实现了对不同操作的封装和执行。
相关文章:
GPT带我学-设计模式-命令模式
1 你知道设计模式的命令模式吗 是的,我知道设计模式中的命令模式。命令模式是一种行为型设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或日志来参数化其他对象。命令模式还支持撤销操作,并且可以提供事务的实现…...
互联网发展历程:跨越远方,路由器的启示
互联网的蓬勃发展,一直在追求更广阔的连接,更遥远的距离。然而,在早期的网络中,人们面临着连接距离有限的问题。一项重要的技术应运而生,那就是“路由器”。 连接受限的问题:距离有限 早期的网络受限于直接…...
postman入门基础 —— 接口测试流程
一、编写接口测试计划 接口测试计划和功能测试计划目标一致,都是为了确认需求、确定测试环境、确定测试方法,为设计测试用例做准备,初步制定接口测试进度方案。一般来说,接口测试计划包括概述、测试资源、测试功能、测试重点、测试…...
springcloud+nacos实现灰度发布
灰度发布 gateway网关实现灰度路由 灰度发布实体 package com.scm.boss.common.bean;import lombok.Data; import lombok.experimental.Accessors;import java.io.Serializable;/*** 灰度发布实体*/ Data Accessors(chain true) public class GrayBean implements Serializ…...
【C++笔记】C++之类与对象(上)
【C笔记】C之类与对象(上) 1、类是结构体的升级2、类中可以定义的东西3、类访问限定符4、类的声明5、类的实例化(定义)6、类的大小的计算7、this指针 1、类是结构体的升级 C的一个显著特征就是兼容C语言,所以C把结构体“升级”成了“类”&am…...
ebay灯串UL报告 UL588检测标准
季节性和装饰性照明用品即灯串以及配件都是便携式插头连接的临时性商品,最大额定输入电压为 120 伏。 由 ILAC ISO 17025 认证的实验室出具的检测报告,确认每件商品均已经过检测,符合下列要求: 季节性和装饰性照明用品(灯串&…...
TCP/IP协议追层分析物理层(第三十九课)
TCP/IP协议追层分析物理层(第三十九课) 1 物理层:建立、维护、断开物理连接,定义了接口及介质,实现了比特流的传输。 1、传输介质分类 有线介质:网线(双绞线)、光纤 无线介质:无线电 微波 激光 红外线 2、双绞线分类: 五类cat5: 适用于100Mbps 超五类cat5e:适用于…...
Kotlin优点及为什么使用Kotlin
文章目录 一 Hello Kotlin二 Kotlin优点三 团队为什么采用 Kotlin 一 Hello Kotlin Kotlin和Andriod 二 Kotlin优点 三 团队为什么采用 Kotlin...
ES 概念
es 概念 Elasticsearch是分布式实时搜索、实时分析、实时存储引擎,简称(ES)成立于2012年,是一家来自荷兰的、开源的大数据搜索、分析服务提供商,为企业提供实时搜索、数据分析服务,支持PB级的大数据。 -- …...
Fairy下载和使用
写在最前:本系列中将会涉及到 Unity,C#,Lua和FairyGUI(FGUI)。 FairyGUI介绍 官网: FairyGUI 编辑器下载: FairyGUI 截至文档记录最新版: https://res.fairygui.com/FairyGUI-Ed…...
隧道HTTP优化程序示例
作为专业爬虫程序员,我们经常需要使用代理服务器处理大量的请求。但是,单一服务器往往无法承担高并发请求和HTTPS加密的压力,这时候我们可以利用CDN来优化性能,并实现反向代理和HTTPS加速。下面,让我们一步步来了解。 …...
Flink源码之State创建流程
StreamOperatorStateHandler 在StreamTask启动初始化时通过StreamTaskStateInitializerImpl::streamOperatorStateContext会为每个StreamOperator 创建keyedStatedBackend和operatorStateBackend,在AbstractStreamOperator中有个StreamOperatorStateHandler成员变量…...
selenium常见等待机制及其特点和使用方法
目录 1、强制等待 2、隐式等待 3、显示等待 1、强制等待 强制等待是在程序中直接调用Thread.sleep(timeout) ,来完成的,该用法的优点是使用起来方便,语法也比较简单,缺点就是需要强制等待固定的时间,可能会造成测试的时间过…...
C++物件数组的常用方法介绍
以下代码建立了一个物件数组Student,并展示了如何计算物件数组的长度,如何从物件数组中找到特定的对象,如何根据数组的不同参数进行排序,以及如何找到最大和最小值。 #include <iostream> #include <algorithm>using…...
云计算:新一代的技术革命
云计算,作为21世纪的一项重要技术革命,已在全球范围内引发了深远的影响。它改变了我们存储和处理数据的方式,使得企业无需再建设和维护昂贵的本地服务器和数据中心。本文将深入探讨云计算的基本概念,类型,主要优点&…...
数据结构—图的应用
6.4图的应用 概念回顾—生成树 生成树:所有顶点均由边连接在一起,但不存在回路的图。 一个图可以有许多棵不同的生成树、含有n个顶点 n-1 条边的图不一定是生成树所有生成树具有以下共同特点 生成树的顶点个数与图的顶点个数相同;生成树是图的…...
Unity 鼠标控制 UI 放大、缩小、拖拽
文章目录 1. 代码2. 测试场景 1. 代码 using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems;public class UIDragZoom : MonoBehaviour, IDragHandler, IScrollHandler {private Vector2 originalSize;private Vector2 originalPosition;private RectTr…...
tensorflow 模型计算中,预测错误;权重参数加载
tensorflow 模型计算中,预测错误;权重参数加载 tensorflow 模型计算主要代码(正确代码) linear1_kernel_initializer tf.constant_initializer(numpy.transpose(data["linear1.weight"])) linear1_bias_initializer …...
Jay17 2023.8.14日报 即 留校集训阶段性总结
8.14 打了moeCTF,还剩一题ak Web。 Jay17-集训结束阶段性总结: 集训产出: 自集训开始以来一个半月,最主要做的事情有三。 一是跟课程,复习学过的知识,学习新的知识;目前课程已大体听完&…...
【C语言】小游戏-扫雷(清屏+递归展开+标记)
大家好,我是深鱼~ 目录 一、游戏介绍 二、文件分装 三、代码实现步骤 1.制作简易游戏菜单 2. 初始化棋盘(11*11) 3.打印棋盘(9*9) 4.布置雷 5.计算(x,y)周围8个坐标的和 6.排查雷 <1>清屏后打印棋盘 <2>递归展开 <3>标记雷 四、完整代…...
告别重复登录:D2RML如何革新暗黑2重制版多开体验
告别重复登录:D2RML如何革新暗黑2重制版多开体验 【免费下载链接】D2RML Diablo 2 Resurrected Multilauncher 项目地址: https://gitcode.com/gh_mirrors/d2/D2RML 作为暗黑破坏神2重制版的忠实玩家,你是否经历过这些令人沮丧的时刻?…...
3大技术突破重新定义魔兽地图编辑工作流
3大技术突破重新定义魔兽地图编辑工作流 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 对于《魔兽争霸III》地图制作者而言,最令人沮丧的体验莫过于:精心设计的地形布局在实际测试中…...
救命!电路板维修高频故障排查口诀,背会秒上手,修板快准稳
修板半天没头绪?工控伺服板一修就慌?测遍元件还烧板?其实电路板故障排查不用死磕,一套好记的速记口诀,能帮你少走弯路、少赔成本,新手能快速上手,老手直接拉高效率,刷到这篇干货&…...
企业开始用 AI 后,最容易被忽略的其实是这件事!
这两年,越来越多企业开始尝试把 AI 用到日常办公中。从写邮件、整理纪要,到查询知识库、生成文档,AI 正在从个人工具变成企业工作的一部分。但很多企业在推进 AI 时,首先关注的往往是功能和效率,比如“能不能写”“能不…...
三步解决Windows 11卡顿难题:开源工具Win11Debloat让系统效率提升3倍
三步解决Windows 11卡顿难题:开源工具Win11Debloat让系统效率提升3倍 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to de…...
手把手教你用JavaScript实现国密SM4加密(附Node.js与微信小程序兼容代码)
从零构建JavaScript国密SM4加密引擎:跨平台实战指南 国密SM4算法作为我国商用密码体系的核心标准,正在金融、政务等领域加速替代国际加密算法。但对于JavaScript开发者而言,直接可用的SM4实现往往面临三大痛点:Node.js与微信小程序…...
ai辅助开发,让快马智能生成centos下openclaw安装与配置的疑难解决方案
在CentOS系统上安装和配置OpenClaw这类工具时,经常会遇到各种依赖冲突、环境配置问题,以及需要定制化爬取规则的情况。传统方式下,我们需要手动查阅文档、调试命令,甚至反复尝试不同版本的依赖包,过程相当耗时。而借助…...
Qwen2-VL-2B-Instruct实战教程:Text-Text语义距离计算在合同比对中的应用
Qwen2-VL-2B-Instruct实战教程:Text-Text语义距离计算在合同比对中的应用 1. 引言:当合同审查遇上AI语义理解 想象一下这个场景:你手头有两份合同,一份是标准模板,另一份是客户发来的修改版。你需要快速找出两份合同…...
3个高效Searchkit高亮技巧:让你的搜索结果直观又专业
3个高效Searchkit高亮技巧:让你的搜索结果直观又专业 【免费下载链接】searchkit Search UI for Elasticsearch & Opensearch. Compatible with Algolias Instantsearch and Autocomplete components. React & Vue support 项目地址: https://gitcode.com…...
新手福音:用快马AI理解ER图,从零开始设计图书馆数据模型
作为一个刚接触数据库设计的小白,我最近被ER图的各种符号和逻辑关系搞得晕头转向。直到发现了InsCode(快马)平台,用它的AI辅助功能尝试做了一个图书馆管理系统的ER图,整个过程简直像开了挂。下面分享我的学习笔记,希望能帮到同样入…...
