当前位置: 首页 > news >正文

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&#xff0c;并展示了如何计算物件数组的长度&#xff0c;如何从物件数组中找到特定的对象&#xff0c;如何根据数组的不同参数进行排序&#xff0c;以及如何找到最大和最小值。 #include <iostream> #include <algorithm>using…...

云计算:新一代的技术革命

云计算&#xff0c;作为21世纪的一项重要技术革命&#xff0c;已在全球范围内引发了深远的影响。它改变了我们存储和处理数据的方式&#xff0c;使得企业无需再建设和维护昂贵的本地服务器和数据中心。本文将深入探讨云计算的基本概念&#xff0c;类型&#xff0c;主要优点&…...

数据结构—图的应用

6.4图的应用 概念回顾—生成树 生成树&#xff1a;所有顶点均由边连接在一起&#xff0c;但不存在回路的图。 一个图可以有许多棵不同的生成树、含有n个顶点 n-1 条边的图不一定是生成树所有生成树具有以下共同特点 生成树的顶点个数与图的顶点个数相同&#xff1b;生成树是图的…...

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 模型计算中&#xff0c;预测错误&#xff1b;权重参数加载 tensorflow 模型计算主要代码&#xff08;正确代码&#xff09; linear1_kernel_initializer tf.constant_initializer(numpy.transpose(data["linear1.weight"])) linear1_bias_initializer …...

Jay17 2023.8.14日报 即 留校集训阶段性总结

8.14 打了moeCTF&#xff0c;还剩一题ak Web。 Jay17-集训结束阶段性总结&#xff1a; 集训产出&#xff1a; 自集训开始以来一个半月&#xff0c;最主要做的事情有三。 一是跟课程&#xff0c;复习学过的知识&#xff0c;学习新的知识&#xff1b;目前课程已大体听完&…...

【C语言】小游戏-扫雷(清屏+递归展开+标记)

大家好&#xff0c;我是深鱼~ 目录 一、游戏介绍 二、文件分装 三、代码实现步骤 1.制作简易游戏菜单 2. 初始化棋盘(11*11) 3.打印棋盘(9*9) 4.布置雷 5.计算(x,y)周围8个坐标的和 6.排查雷 <1>清屏后打印棋盘 <2>递归展开 <3>标记雷 四、完整代…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

Android Framework预装traceroute执行文件到system/bin下

文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数&#xff08;使用 ICMP Echo 请求&#xff09;-T 参数&#xff08;使用 TCP SYN 包&#xff09; 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11&#xff0c;在/s…...

若依项目部署--传统架构--未完待续

若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加&#xff0c;传统开发模式存在效率低&#xff0c;重复劳动多等问题。若依项目通过整合主流技术框架&…...

【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...

第21节 Node.js 多进程

Node.js本身是以单线程的模式运行的&#xff0c;但它使用的是事件驱动来处理并发&#xff0c;这样有助于我们在多核 cpu 的系统上创建多个子进程&#xff0c;从而提高性能。 每个子进程总是带有三个流对象&#xff1a;child.stdin, child.stdout和child.stderr。他们可能会共享…...

年度峰会上,抖音依靠人工智能和搜索功能吸引广告主

上周早些时候举行的第五届年度TikTok World产品峰会上&#xff0c;TikTok推出了一系列旨在增强该应用对广告主吸引力的功能。 新产品列表的首位是TikTok Market Scope&#xff0c;这是一个全新的分析平台&#xff0c;为广告主提供整个考虑漏斗的全面视图&#xff0c;使他们能够…...

Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法

在 MyBatis 中使用 useGeneratedKeys"true" 获取新插入记录的自增 ID 值&#xff0c;可通过以下步骤实现&#xff1a; 1. 配置 Mapper XML 在插入语句的 <insert> 标签中设置&#xff1a; xml 复制 下载 运行 <insert id"insertUser" para…...

MongoDB $type 操作符详解

MongoDB $type 操作符详解 引言 MongoDB 是一款流行的开源文档型数据库,它提供了丰富的查询操作符来满足不同的数据查询需求。在 MongoDB 中,$type 操作符是一个非常有用的查询操作符,它允许用户根据文档中字段的类型来查询文档。本文将详细介绍 MongoDB 的 $type 操作符,…...

全球化2.0|云轴科技ZStack助力香港服务机构VMware替代

香港一家大型社会服务机构长期致力于为公众提供支持与服务&#xff0c;是本地具有代表性的社会服务组织&#xff0c;在香港设有数十个服务中心。为应对VMware订阅模式带来的成本上升和硬件资源受限等问题&#xff0c;该机构决定采用云轴科技ZStack Cloud云平台替代VMware虚拟化…...

交易系统开发:跨境资本的高速通道架构解密

连接纽约、香港与内陆的金融管道工程 总收益互换&#xff08;TRS&#xff09;在港美股投资中扮演着跨境资本流动的“隐形桥梁”。本文基于真实跨境券商系统开发实践&#xff0c;深入解析支持多市场、多币种、多通道的TRS平台架构设计与业务解决方案。 一、港美股TRS的核心价值&…...