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

设计模式8-命令模式

定义

        Command Partern: 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。(核心思想是将“动作”与“执行者”解耦)

场景

  • GUI:操作将UI控件与业务逻辑解耦,一个命令可被多处复用。

  • 撤销/重做:通过记录命令历史和状态,实现操作的回逆。

  • 任务队列:实现任务的延迟执行和异步处理,解耦生产与消费。

  • 宏录制:使用组合模式将多个命令组合成一个宏命令。

  • 事务系统:提供原子操作和回滚机制。

  • 异步回调:封装未来需要执行的操作,实现模块间的解耦通信。

Java中的典型场景

  1. Swing/AWT事件处理:ActionListener本质是命令模式。

  2. 线程池:RunnableCallable任务封装了执行逻辑。

  3. 事务管理:数据库操作封装为可回滚的命令对象。

代码

import java.util.Stack;
// 文档编辑器的撤销和执行
// 命令接口
interface EditorCommand {void execute();void undo();
}// 接收者:文档
class Document {private StringBuilder content = new StringBuilder();public String getContent() {return content.toString();}public void insertText(String text) {content.append(text);System.out.println("插入文本: " + text + ",当前内容: " + content);}public void deleteText(int length) {if (length > content.length()) {length = content.length();}String deleted = content.substring(content.length() - length);content.delete(content.length() - length, content.length());System.out.println("删除文本: " + deleted + ",当前内容: " + content);}
}// 具体命令:插入文本
class InsertCommand implements EditorCommand {private Document document;private String text;public InsertCommand(Document doc, String text) {this.document = doc;this.text = text;}@Overridepublic void execute() {document.insertText(text);}@Overridepublic void undo() {document.deleteText(text.length());}
}// 调用者:编辑器
class TextEditor {private Stack<EditorCommand> commandHistory = new Stack<>();private Stack<EditorCommand> redoStack = new Stack<>();public void executeCommand(EditorCommand command) {command.execute();commandHistory.push(command);redoStack.clear(); // 执行新命令后清空重做栈}public void undo() {if (!commandHistory.isEmpty()) {EditorCommand command = commandHistory.pop();command.undo();redoStack.push(command);System.out.println("执行撤销操作");} else {System.out.println("没有可撤销的操作");}}public void redo() {if (!redoStack.isEmpty()) {EditorCommand command = redoStack.pop();command.execute();commandHistory.push(command);System.out.println("执行重做操作");} else {System.out.println("没有可重做的操作");}}
}// 测试类class TextEditorDemo {public static void main(String[] args) {Document doc = new Document();TextEditor editor = new TextEditor();System.out.println("=== 编辑文档过程 ===");editor.executeCommand(new InsertCommand(doc, "Hello "));editor.executeCommand(new InsertCommand(doc, "World "));editor.executeCommand(new InsertCommand(doc, "Java!"));System.out.println("\n=== 撤销操作 ===");editor.undo(); // 撤销插入"Java!"editor.undo(); // 撤销插入"World "System.out.println("\n=== 重做操作 ===");editor.redo(); // 重做插入"World "editor.redo(); // 重做插入"Java!"}
}

生活中的示例:文档编辑器撤销 (Undo) 和重做 (Redo) 功能,比如餐厅点餐系统的例子:服务员(调用者)接收顾客的点单(命令),然后交给厨房(接收者)执行。在比如家电遥控器:遥控器上的每个按钮都对应一个命令,按下按钮就执行相应操作(开、关、调节等)

命令模式代码

http://www.dtcms.com/a/353603.html

相关文章:

  • docker常用命令有哪些
  • ASM字节码框架和KSP能够解析JAR包或者AAR包里面的内容吗?
  • 碰一碰发视频手机版源码开发:支持OEM
  • 76 最小覆盖子串
  • CPTS-Reddish
  • 【开发配置】云服务器配置Gitlab服务
  • 解决pod install报错问题的一些方法
  • 合金弹头全系列游戏合集分享 电脑安卓手机掌机SWITCH整合版 (1/2/X/3/4/5/6/7/XX)
  • Elasticsearch数据迁移快照方案初探(二):快照创建与多节点存储问题解决
  • Kafka经典面试题--Kafka的其他问题汇总
  • 嵌入式第三十九天(TCP多任务并发)
  • C语言二级考试环境配置详细教程【mac篇】
  • Java设计模式之《亨元模式》
  • HttpRequest.get()方法报错:301 Moved Permanently
  • XFile v2 系统架构文档
  • Unity List 相关
  • QOpenGLFunctions_2_1 与 OpenGL 的区别
  • 【系统架构设计(四)】软件工程:从瀑布到敏捷的演进之路
  • 【系统架构设计(三)】系统工程与信息系统基础下:企业信息化与电子商务-数字化转型的核心驱动力
  • 【Django + Pure Admin】基于Django+Vue3的前后端分离管理系统框架设计
  • 服务器硬件电路设计之 SPI 问答(六):如何提升服务器硬件电路中的性能?如何强化稳定性?
  • MySQL explain命令的作用
  • 什么是AI+?什么是人工智能+?
  • 济南大学杨波与济南青盟信息技术有限公司杨华伟
  • 北京国标竞品调查,知己知彼(竞品调查研究)
  • Java全栈开发面试实战:从基础到微服务的深度探索
  • Linux学习-TCP并发服务器构建
  • XState
  • 第五章:循环
  • Playwright之脱离元素,页面操作大全!