news 2026/5/9 0:14:16

Java设计模式-命令模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java设计模式-命令模式

在 Java 中使用命令模式来模拟餐厅下单吃饭的过程,可以通过以下步骤来实现:

  1. 创建命令接口:所有的命令都需要实现一个命令接口,包含一个execute()方法。

  2. 创建具体的命令类:每个具体的命令(比如下单、撤销订单)都需要实现命令接口。

  3. 创建接收者类:这些类是命令的实际执行者(如餐厅的服务员、厨师等)。

  4. 创建命令调用者类:负责调度命令并保存命令以支持撤销功能。

以下是一个简单的实现:

1. 创建命令接口

public interface Command { void execute(); // 执行命令 void undo(); // 撤销命令 }

2. 创建接收者类(如餐厅服务员、厨师等)

// 服务员类 public class Waiter { public void takeOrder(String order) { System.out.println("服务员:接到订单 - " + order); } public void serveOrder(String order) { System.out.println("服务员:提供餐点 - " + order); } public void cancelOrder(String order) { System.out.println("服务员:取消订单 - " + order); } }

3. 创建具体的命令类

// 下单命令 public class OrderCommand implements Command { private Waiter waiter; private String order; public OrderCommand(Waiter waiter, String order) { this.waiter = waiter; this.order = order; } @Override public void execute() { waiter.takeOrder(order); } @Override public void undo() { waiter.cancelOrder(order); } } // 上菜命令 public class ServeCommand implements Command { private Waiter waiter; private String order; public ServeCommand(Waiter waiter, String order) { this.waiter = waiter; this.order = order; } @Override public void execute() { waiter.serveOrder(order); } @Override public void undo() { System.out.println("撤销上菜命令"); } }

4. 创建命令调用者类(Invoker)

// 下单命令 public class OrderCommand implements Command { private Waiter waiter; private String order; public OrderCommand(Waiter waiter, String order) { this.waiter = waiter; this.order = order; } @Override public void execute() { waiter.takeOrder(order); } @Override public void undo() { waiter.cancelOrder(order); } } // 上菜命令 public class ServeCommand implements Command { private Waiter waiter; private String order; public ServeCommand(Waiter waiter, String order) { this.waiter = waiter; this.order = order; } @Override public void execute() { waiter.serveOrder(order); } @Override public void undo() { System.out.println("撤销上菜命令"); } }

5. 测试代码

public class Main { public static void main(String[] args) { // 创建服务员对象 Waiter waiter = new Waiter(); // 创建命令对象 Command order1 = new OrderCommand(waiter, "炒饭"); Command serve1 = new ServeCommand(waiter, "炒饭"); // 创建命令调用者对象 OrderInvoker invoker = new OrderInvoker(); // 下单并执行命令 invoker.executeCommand(order1); invoker.executeCommand(serve1); // 撤销上一个命令(如取消订单) invoker.undoCommand(); // 撤销上菜命令 invoker.undoCommand(); // 撤销订单命令 } }

6. 输出结果

服务员:接到订单 - 炒饭 服务员:提供餐点 - 炒饭 撤销上菜命令 服务员:取消订单 - 炒饭

解释:

  1. Command接口定义了两个方法:execute()undo()execute()用于执行命令,undo()用于撤销命令。

  2. Waiter是命令的接收者,负责具体的操作(如下单、提供餐点、取消订单等)。

  3. OrderCommandServeCommand是具体的命令类,实现了Command接口。

  4. OrderInvoker负责接收命令并执行,同时维护一个历史栈(commandHistory),以便支持撤销功能。

通过命令模式,你可以将请求的发送者(如用户)和请求的执行者(如服务员)解耦,并且支持命令的撤销操作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 12:27:12

基于LobeChat的客户支持机器人设计与落地案例

基于LobeChat的客户支持机器人设计与落地案例 在客户服务领域,一个看似简单的问题——“我该怎么重置密码?”——背后往往隐藏着巨大的运营成本。传统客服系统依赖人工响应,面对高频、重复性咨询时,不仅效率低下,还容易…

作者头像 李华
网站建设 2026/5/4 0:24:33

人脸识别技术:从传统方法到深度学习的演进路径

人脸识别作为计算机视觉领域最具实用性的任务之一,已深度渗透至身份验证、安防监控、金融风控等场景。其技术演进的核心逻辑,本质是「特征表示能力」与「泛化鲁棒性」的迭代——从依赖人工设计的传统方法,到以数据驱动的深度学习模型&#xf…

作者头像 李华
网站建设 2026/5/5 13:27:22

还在熬夜写论文?6个免费AI神器:选题大纲开题初稿降重全搞定!

还在为了论文选题而绞尽脑汁,在浩如烟海的文献中迷失方向吗?还在通宵达旦地赶初稿,却始终难以落笔,被截止日期追得喘不过气吗?还在面对导师密密麻麻的修改意见,反复返工却依然达不到要求,陷入无…

作者头像 李华
网站建设 2026/4/28 15:16:48

数据结构入门:哈希表和树结构

一、排序 二分查找:基于有序结构的高效查找1.1. 基本流程对于无序数据集,先通过排序将其转化为有序结构,再利用二分查找实现高效查询:排序阶段:采用时间复杂度为 O(nlogn) 的算法(如快速排序、归并排序&am…

作者头像 李华
网站建设 2026/5/5 1:36:34

Qwen-Image与CLIP融合实现精准图文匹配

让AI真正“读懂”你的每一句话:Qwen-Image与CLIP融合下的图文匹配新范式 你有没有试过这样一条提示词:“穿着汉服的程序员在故宫敲代码,屏幕上滚动着Python脚本,窗外烟花绽放写着‘2025’”。点击生成后,画面确实古风十…

作者头像 李华
网站建设 2026/5/6 7:22:00

Markdown语法详解:为你的TensorFlow技术博客排版加分

Markdown 与 TensorFlow:如何用简洁排版释放深度学习表达力 在 AI 开发者的日常中,有一个场景几乎无人不晓:你终于调通了一个复杂的模型,训练准确率突破了预期,满心欢喜地准备把成果写成博客分享出去——结果打开编辑器…

作者头像 李华