Java 编程之命令模式

什么是命令模式

命令模式Command Pattern 是一种行为型设计模式,它把请求封装成对象,从而将请求的发送者与执行者完全解耦,支持排队、撤销、日志记录等操作。。

模式目标
解耦命令的发出者(Invoker)执行者(Receiver)

模式例子

在生活中,比如麦当劳点餐流程,来看看命令模式的经典现实例子:

角色对应命令模式中的角色
顾客请求发送者 Invoker
点餐员命令对象 Command
厨房/厨师实际执行者 Receiver
点菜单被封装的命令 Request
顾客(Invoker)下单 → 服务员记录订单(Command) → 厨师(Receiver)执行烹饪操作
  • 顾客不关心怎么做菜;
  • 厨师不关心是谁点的;
  • 服务员中转命令,负责排队、取消、记录等操作。

👉 服务员就是命令模式中的 Command 对象

UML图

通用表示:
在这里插入图片描述
针对本例:
在这里插入图片描述

Java 命令模式完整实现

我们模拟一个遥控器控制家电的命令模式案例。

命令接口

Command

public interface OrderCommand {void execute();
}

厨师类(实际执行者 Receiver)

public class Chef {public void makeBurger() {System.out.println("🍔 厨师正在制作汉堡!");}public void makeFries() {System.out.println("🍟 厨师正在炸薯条!");}
}

实际执行者 Receiver

public class BurgerOrder implements OrderCommand {private Chef chef;public BurgerOrder(Chef chef) {this.chef = chef;}@Overridepublic void execute() {chef.makeBurger();}
}public class FriesOrder implements OrderCommand {private Chef chef;public FriesOrder(Chef chef) {this.chef = chef;}@Overridepublic void execute() {chef.makeFries();}
}

服务员类(Invoker)

public class Waiter {private List<OrderCommand> orderList = new ArrayList<>();public void takeOrder(OrderCommand command) {orderList.add(command);}public void submitOrders() {System.out.println("🧾 服务员提交订单给厨房...");for (OrderCommand command : orderList) {command.execute();}orderList.clear();}
}

客户端测试代码

public class Customer {public static void main(String[] args) {Chef chef = new Chef();// 创建命令对象OrderCommand burger = new BurgerOrder(chef);OrderCommand fries = new FriesOrder(chef);// 顾客下单,服务员记录Waiter waiter = new Waiter();waiter.takeOrder(burger);waiter.takeOrder(fries);// 服务员提交订单,厨师开始执行waiter.submitOrders();}
}

运行结果

在这里插入图片描述

命令模式的优点与用途

优点

优点描述
解耦调用者和接收者请求发送者不关心具体怎么做
支持撤销与日志记录可记录命令序列,回滚操作
支持命令组合与排队命令对象可以存入队列或组合

实际应用场景

应用场景示例说明
UI按钮命令绑定Swing按钮点击执行某个命令
事务操作/回滚数据库事务日志
宏命令/组合操作Photoshop一键动作
消息队列处理Kafka、RabbitMQ 消息处理器

总结

  • 命令模式是高内聚、低耦合的典范;
  • 适合对请求进行记录、排队、撤销等处理;
  • 可广泛应用于 UI 控件回调、遥控设备、游戏命令、数据库事务管理等场景。

参考

《23种设计模式概览》

在这里插入图片描述

@startuml
title Java命令模式结构图interface Command {+execute()
}class ConcreteCommand {-receiver: Receiver+execute()
}class Receiver {+action()
}class Invoker {+setCommand(cmd: Command)+invoke()
}Command <|-- ConcreteCommand
ConcreteCommand --> Receiver
Invoker --> Command@enduml

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

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

相关文章

TCP 三次握手与四次挥手全流程详解

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。为了建立和终止连接,TCP 使用了 三次握手 和 四次挥手 的机制。本文将从原理到状态变化,详细解析 TCP 连接的建立与释放全过程,力求专业、准确。 一、TCP 三次握手(Three-Way Han…

MySQL 慢 SQL 识别与优化

一、识别慢 SQL 1. 启用慢查询日志 -- 查看当前慢查询配置 SHOW VARIABLES LIKE slow_query%; SHOW VARIABLES LIKE long_query_time;-- 开启慢查询日志&#xff08;临时生效&#xff09; SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 2; -- 设置慢查询阈值…

墨记APP:水墨风记事,书写生活诗意

在快节奏的现代生活中&#xff0c;记录生活的点滴成为了一种独特的仪式感。无论是日常的琐事、突发的灵感&#xff0c;还是对未来的规划&#xff0c;一款好用的记事软件都能帮助我们更好地整理思绪&#xff0c;留住美好瞬间。墨记APP正是一款兼具美学与实用性的记事软件&#x…

龙芯7A1000桥片数据手册解读(时序)

RTC是电池&#xff0c;理论上一直是有电的&#xff0c;图示指的是接上220V电之后切换为系统的电。顺序是这样的&#xff1a;接上220V电之后系统的12V供电就有了&#xff0c;12V转为5VSB&#xff0c;5VSB供给RTC3V&#xff0c;此时RTC3V转为系统供电而不是电池供电。这里的5VSB指…

无人机气压计模块技术解析

一、运行方式 1. 基础原理 气压计通过测量大气压力间接计算高度。无人机飞行中&#xff0c;气压随高度上升而降低&#xff0c;传感器将压力信号转为电信号&#xff0c;经ADC转换为数字值。 2. 工作流程 数据采集&#xff1a;同步获取压力与温度值。 原始数据处理&…

第十四节:第三部分:IO流:前置知识-什么是方法递归以及递归的形式、递归算法三要素

什么是方法递归以及递归的形式 递归算法三要素 代码 代码一&#xff1a;认识一下递归的形式 package com.itheima.Recurtion; //目标:认识一下递归的形式 public class RecurtionTest1 {public static void main(String[] args) {test2();}//直接方法递归public static void…

论文阅读笔记:Digging Into Self-Supervised Monocular Depth Estimation

论文阅读笔记&#xff1a;Digging Into Self-Supervised Monocular Depth Estimation 1 背景2 创新点3 方法4 模块4.1 自监督训练4.2 优化自监督深度估计4.2.1 每个像素的最小重建损失4.2.2 自动掩码静态像素4.2.3 多尺度估计4.2.4 最终的训练损失 4.3 额外考虑 5 效果 1 背景 …

YAML 数据格式详解

1. YAML 概念 YAML (YAML Ain’t Markup Language) 是一种人性化的数据序列化格式&#xff1a; 专注于数据而非标记&#xff08;与 XML 不同&#xff09;使用简洁的语法表示复杂数据结构可读性高&#xff0c;适合人类编写和阅读广泛应用于配置文件&#xff08;如 Docker Comp…

react扩展

首先补充一下上个章节的一点结尾内容。reducer是一个纯函数&#xff0c;纯函数指的是当我们在redux里面定义了我们需要共享的对象后&#xff0c;我们是不可以对共享的对象本身进行改变的。我们在获取更新后的共享数据时&#xff0c;要去重新定义一个新的变量来获取更新后的共享…

6.获取图片灰度与缩放

目录 一、Halcon 1. 获取像素坐标以及灰度 2. 拖动缩放 3.图像缩放的实现方式 二、VS联合编程 1.获取像素坐标和灰度 2.拖动缩放 一、Halcon 1. 获取像素坐标以及灰度 *1. 获取像素坐标 * 1. get_mposition * 2. halcon窗口事件自带坐标数据 * *2. 获取像素灰度 *…

无人机+AI:革新集装箱箱号识别的智能解决方案

在现代化物流体系中&#xff0c;集装箱箱号识别是货物追踪与管理的核心环节。然而&#xff0c;传统的人工巡检或固定摄像头识别方式存在效率低、覆盖范围有限、易受环境干扰等问题&#xff0c;难以满足日益增长的物流需求。基于无人机与AI技术的集装箱箱号识别系统&#xff0c;…

一种新的参数高效微调方法-LoRI

论文&#xff1a;LoRI: Reducing Cross-Task Interference in Multi-Task Low-Rank Adaptation LoRA 具体参考 1. 引言与背景&#xff1a;为什么需要 LoRI&#xff1f; 这篇论文提出了一种新的参数高效微调&#xff08;PEFT&#xff09;方法&#xff0c;名为 LoRA with Reduce…

Go网络编程:基于TCP的网络服务端与客户端

Go 语言的 net 包为网络编程提供了简洁高效的接口。我们可以使用它快速构建 TCP 网络服务&#xff0c;如聊天服务器、RPC、微服务通信等。 一、TCP简介 TCP&#xff08;Transmission Control Protocol&#xff09;是面向连接的、可靠的传输协议&#xff0c;通信模型为客户端-服…

【StarRocks系列】架构、核心概念

目录 一、架构&#xff1a;分布式 MPP 列式存储 向量化引擎 二、存储&#xff1a;高性能列式存储引擎 三、表设计&#xff1a;三类模型适配不同场景 四、数据写入&#xff1a;多种方式支持实时与批量 五、数据读取&#xff1a;极致优化的查询引擎 总结&#xff1a;Star…

从源码到生产:Apache 2.4.57 自动化安装实战指南(附脚本)

引言&#xff1a;为何选择源码安装 Apache&#xff1f; 在服务器运维场景中&#xff0c;源码编译安装 Apache HTTP Server 是实现精细化配置的重要方式。相比包管理器安装&#xff0c;源码安装可自定义模块组合、适配特定依赖环境&#xff0c;并精确控制版本。本文将通过自动化…

iOS开发中的安全实践:如何通过Ipa混淆与加固确保应用安全

随着移动应用技术的不断发展&#xff0c;开发者越来越重视应用的安全性&#xff0c;尤其是iOS应用。无论是面对大规模的数据泄露问题&#xff0c;还是在应用上线后避免被逆向破解&#xff0c;开发者们都需要采取一系列技术手段来保护应用。然而&#xff0c;很多开发者在应用开发…

JAVA实战开源项目:智慧生活商城系统 (Vue+SpringBoot) 附源码

本文项目编号 T 245 &#xff0c;文末自助获取源码 \color{red}{T245&#xff0c;文末自助获取源码} T245&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

GNU Octave 基础教程(8):GNU Octave 常用数学函数

目录 一、基本算术运 二、初等数学函数 三、三角函数与反三角函数 四、统计函数 五、复数与其他函数 ✅ 小结 &#x1f51c; 下一讲预告 GNU Octave 内置了大量数学函数&#xff0c;涵盖初等数学、线性代数、复数运算、统计函数等&#xff0c;非常适合科研、工程计算使用…

Go语言中的文件与IO:JSON、CSV、XML处理

在数据交换与存储中&#xff0c;JSON、CSV、XML 是常见格式。Go 标准库为这些格式提供了强大且易用的支持&#xff0c;涵盖结构体映射、读写文件、编码解码等操作。 一、JSON处理&#xff08;encoding/json&#xff09; 1. 基本使用&#xff1a;结构体 <-> JSON type U…

三种语言写 MCP

参考 https://zhuanlan.zhihu.com/p/1915029704936760261 https://www.5ee.net/archives/tmXJAgWz https://github.com/modelcontextprotocol/python-sdk https://github.com/modelcontextprotocol/typescript-sdk https://modelcontextprotocol.io/quickstart/server https:/…