毅四捕Go设计模式笔记——命令模式

命令模式(Command Pattern)

为了解决什么问题?

命令模式的目的是将请求发起者和请求执行者解耦,使得请求的发起者不需要知道具体的执行者是谁,也不需要知道执行的具体过程,只需要发送请求即可。

通过使用命令对象来封装请求,可以参数化和传递可调用的动作。同时,支持可撤销操作和队列请求等功能。

怎么用代码实现?

下面让我们通过一个餐厅下单的例子来看看怎么实现命令模式。例子里包含三个角色:

  • 顾客
  • 服务员
  • 厨师
    服务员在收到顾客的点餐请求后,然后将请求封装成命令,并交给厨师准备食物。

首先,定义好作为命令执行者的厨师,这里的厨师会制作汉堡包和沙拉。

/*** 厨师接收点菜的命令并开始烹饪*/
public class Chef {public void makeBurger() {System.out.println("Chef is making a burger");}public void makeSalad() {System.out.println("Chef is making a salad");}
}

然后,定义抽象下单命令,以及具体的汉堡包和沙拉的下单命令。

public interface OrderCommand {void execute();
}/*** 烹饪汉堡包的命令*/
public class BurgerOrderCommand implements OrderCommand {@Overridepublic void execute(Chef chef) {chef.makeBurger();}
}/*** 准备沙拉的命令*/
public class SaladOrderCommand implements OrderCommand {@Overridepublic void execute(Chef chef) {chef.makeSalad();}
}

接着,定义服务员角色。

/*** 服务员是命令的调用者*/
public class Waiter {private Chef chef;private OrderCommand orderCommand;public Waiter(Chef chef) {this.chef = chef;}public void sendOrderCommandToKitchen(OrderCommand orderCommand) {this.orderCommand = orderCommand;System.out.println("Waiter sending order to kitchen...");orderCommand.execute(chef);}
}

最后,顾客通过服务员下单,让厨师做出想吃的菜品。

/*** 餐厅顾客类*/
public class RestaurantClient {public static void main(String[] args) {Chef chef = new Chef(); // 接收方Waiter waiter = new Waiter(chef); // 调用方OrderCommand burgerOrder = new BurgerOrderCommand(); // 顾客想吃汉堡waiter.sendOrderCommandToKitchen(burgerOrder); // 服务员收到顾客订单后,将订单发送至厨房OrderCommand saladOrder = new SaladOrderCommand(); // 顾客改主意,想吃沙拉waiter.sendOrderCommandToKitchen(saladOrder); // 服务员收到顾客订单后,将订单发送至厨房}
}

为什么可以解决这个问题?

命令模式通过将具体的请求封装成对象,使得发起请求的操作和接收请求的对象之间不直接发生依赖关系,从而实现请求发起者和请求执行者的解耦。

因为命令对象把请求封装成了对象,这使得你可以用不同的请求、队列或者日志来参数化其他对象,也可以支持撤销操作。

命令模式适用于哪些场景?

参数化对象:需要将请求参数化并传递给调用者时,可以使用命令模式。

操作排队:需要将请求排队执行,例如任务队列、线程池等。

支持撤销操作:需要提供撤销和恢复请求功能的场景。

支持宏命令:可以使用命令模式组合多个命令,实现宏命令的功能。

命令模式在开源代码中比较场景,下面是典型的案例:

Swing中的Action:Java Swing库中,javax.swing.Action接口代表了一个抽象的用户界面动作,它本身就是命令模式的一种实现。

Guava的事件总线:Guava库中的事件总线(EventBus)可以结合命令模式使用,发布者发布命令事件,而订阅者则执行相关的命令。

命令模式把发送命令的责任和执行命令的责任分开,确保了系统设计的灵活性和扩展性。此外,它还简化了其他对象的逻辑,因为它们不需要知道实际的执行逻辑。这一模式特别适用于实现撤销(redo)/恢复(undo)操作、事务系统等需要定义、存储、传递和执行请求的场合。

———————————这是分割线———————————

欢迎添加博主vx深入交流:
博主微信

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

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

相关文章

汇丰、Paypal、万事达新动作!全球银行如何构筑量子安全堡垒?

2024年4月22日,欧洲刑警组织更新发文称,其下属欧洲网络犯罪中心(EC3)与EC3金融服务咨询小组密切合作,创建了量子安全金融论坛(QSFF)。EC3提供常设秘书处服务,以支持QSFF和指导委员会…

题目 2671: 推导部分和

题目描述: 对于一个长度为 N 的整数数列 A1, A2, AN,小蓝想知道下标 l 到 r 的部分和 是多少? 然而,小蓝并不知道数列中每个数的值是多少,他只知道它的 M 个部分和的值。其中第 i 个部分和是下标 li 到 ri 的部分和 &#xf…

rtl8188ftv debian linux 多架构移植方法

5 块包邮,挂到 x86_64 debian 12 虚拟机,实测下载能到 22Mbps,也可能就2Mbps,上传能到 40Mbps 关键词: rtl8xxxu、rtl8xxxu.ko、rtl8xxxu_8188f.c、mac80211.h、cfg80211.ko、sudo modinfo rtl8xxxu.ko | grep depen…

[Real-Time Spectrum Analyzers (RTSA) ] 实时频谱分析 A

废话: 这部分内容比较多,先写一部分吧; 这个是频谱仪的一部分功能,姑且把仪器制造商分别一流和其他吧; 一流的应该只有两家,Agilent 安捷伦和 R&S罗德与施瓦茨; 一、安捷伦的部分新产品9…

使用 Docker 自建一款怀旧游戏之 - 扫雷

1)扫雷 简介 扫雷 是一种经典的单人电脑游戏,最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中。游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块,而不触发地雷。每个方块上都标有数字,表示周围 8 个方块中…

箭头函数的一些总结

箭头函数,我们常常会用到,那它在使用上和常规函数有什么区别呢?我们来一起看看哈 先来定义一个普通函数,一个箭头函数,分别看一下它们的结构 function abc(){} console.dir(abc)通过查看结构我们知道普通函数有两个原型,一个是作为函数特有的prototype,原型另一个是作为对象…

用Python Turtle画一个中国结

中国结,作为中华民族传统文化的象征之一,以其独特的编织技艺和深厚的文化内涵,深受人们喜爱。今天,我们就来用Python的turtle模块,尝试绘制一个充满韵味的中国结。 我们先来看看整个中国结生成的过程: 中国…

算法学习Day1——【数据结构】单调栈

1.什么是单调栈以及单调栈的作用 (1)定义 顾名思义,单调栈是一个有序的栈,可能从栈顶到栈底单调递增(单调递增栈),也有可能从栈顶到栈底单调递减(单调递减栈)。 &…

KUKA机器人如何给IO信号或寄存器添加中文注释信息?

KUKA机器人如何给IO信号或寄存器添加中文注释信息? 如下图所示,首先,我们需要登录专家以上用户权限(默认密码KUKA), 如下图所示,点击“投入运行”—“网络配置”, 如下图所示,此时机器人的IP地址为192.168.1.10, 如下图所示,用一根网线连接机器人控制柜到笔记…

[SpringBoot] JWT令牌——登录校验

JWT(JSON Web Token)是一种用于在网络应用之间传递信息的开放标准(RFC 7519)。它由三部分组成:头部(header)、载荷(payload)和签名(signature)。J…

使用大模型框架 LlamaIndex ,释放多文档代理的强大功能

在自然语言处理和信息检索领域,多文档代理(MDAs)的出现带来了重大的进步。这些代理引入了一系列增强功能,包括在文档检索过程中重新排名和复杂查询规划工具,这代表了信息检索系统的范式转变。 传统上,搜索…

Flask表单详解

Flask表单详解 概述跨站请求伪造保护表单类把表单渲染成HTML在视图函数中处理表单重定向和用户会话Flash消息 概述 尽管 Flask 的请求对象提供的信息足够用于处理 Web 表单,但有些任务很单调,而且要重复操作。比如,生成表单的 HTML 代码和验…