設計模式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.pswp.cn/bicheng/95172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95172.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構(順序表力扣刷題)

1.移除元素 給你一個數組 nums 和一個值 val&#xff0c;你需要 原地 移除所有數值等于 val 的元素。元素的順序可能發生改變。然后返回 nums 中與 val 不同的元素的數量。 假設 nums 中不等于 val 的元素數量為 k&#xff0c;要通過此題&#xff0c;您需要執行以下操作&…

機器學習 - Kaggle項目實踐(6)Dogs vs. Cats Redux: Kernels Edition 貓狗二分類

Dogs vs. Cats Redux: Kernels Edition | Kaggle 任務&#xff1a;給定貓狗圖像數據集 進行二分類。 Cats or Dogs - using CNN with Transfer Learning | Kaggle&#xff08;參考&#xff09; Cats or Dogs | Kaggle &#xff08;我的kaggle&#xff09; 本文介紹了使用Re…

基礎的匯編指令

目錄 1、接上一個csdn特殊功能寄存器 1.1CPSR寄存器 1.2SPSR寄存器 1.3CPSR寄存器的高四位和第四位 ?編輯 2、匯編指令的分類 3、匯編指令的基本格式 4、數據搬移指令&#xff08;賦值指令&#xff09; 4.1指令碼 4.2指令格式 4.3測試代碼 4.5立即數 4.6ldr偽指令 …

Docker實戰避坑指南:從入門到精通

摘要&#xff1a;文人結合自身微服務實踐&#xff0c;系統梳理從安裝適配、鏡像拉取&#xff0c;到運行配置、構建優化、多容器編排、數據持久化、監控運維等 Docker 全流程高頻踩坑點&#xff0c;給出可落地的解決方案&#xff0c;幫助讀者快速規避同類問題并提升容器化效率。…

《Bishop PRML》10.1. Variational Inference(2)理解VAE

通過VAE與AE理解變分分布的變量 如何理解變分推斷公式中,Z和X的含義是什么? 知乎 變分自編碼器VAE的數學原理。 csdn 變分自編碼器(VAE)的數學原理以及實現 Loss functions in Variational Autoencoders (VAEs) 一文解釋 VAE+ELBO AE的編碼和解碼是確定性的。VAE的解碼過程…

函數調用中的初始化與賦值——深入理解C++對象的生命周期

技術博客&#xff1a;函數調用中的初始化與賦值——深入理解C對象的生命周期引言在C編程中&#xff0c;理解函數調用過程中參數傳遞、對象創建和返回值處理的細節對于編寫高效且無誤的代碼至關重要。本文將通過一個具體的例子來探討函數調用時實參到形參的轉換過程&#xff0c;…

矩陣微積分的鏈式法則(chain rule)

矩陣微積分的鏈式法則&#xff08;chain rule&#xff09;與標量情況一樣&#xff0c;用于求復合函數的導數&#xff0c;但由于涉及矩陣和向量的求導&#xff0c;維度匹配和布局約定&#xff08;numerator-layout vs. denominator-layout&#xff09;必須格外小心。下面給出常見…

網絡編程4-并發服務器、阻塞與非阻塞IO、信號驅動模型、IO多路復用..

一、并發服務器1、單循環服務器&#xff08;順序處理&#xff09; 一次只能處理一個客戶端連接&#xff0c;只有當前客戶端斷開連接后&#xff0c;才能接受新的客戶端連接2、多進程/多線程并發服務器while(1) {connfd accept(listenfd);pid fork(); // 或 pthread_cr…

在 WSL2-NVIDIA-Workbench 中安裝Anaconda、CUDA 13.0、cuDNN 9.12 及 PyTorch(含完整環境驗證)

在 WSL-NVIDIA-Workbench&#xff08;NVIDIA AI Workbench & Ubuntu 22.04&#xff09;中 安裝 Anaconda、CUDA 13.0、cuDNN 9.12 及 PyTorch 步驟也可參閱&#xff1a; 在WSL2-Ubuntu中安裝Anaconda、CUDA13.0、cuDNN9.12及PyTorch&#xff08;含完整環境驗證&#xf…

Shell編程核心入門:參數傳遞、運算符與流程控制全解析

Shell編程核心入門&#xff1a;參數傳遞、運算符與流程控制全解析 在Linux/Unix系統中&#xff0c;Shell作為命令解釋器和腳本語言&#xff0c;是自動化運維、批量處理任務的核心工具。掌握Shell腳本的參數傳遞、運算符使用和流程控制&#xff0c;能讓你從“手動執行命令”升級…

如何用 Kotlin 在 Android 手機開發一個應用程序獲取網絡時間

使用 NTP 協議獲取網絡時間在 build.gradle 文件中添加以下依賴&#xff1a;implementation commons-net:commons-net:3.6創建 NTP 時間獲取工具類&#xff1a;import org.apache.commons.net.ntp.NTPUDPClient import org.apache.commons.net.ntp.TimeInfo import java.net.In…

python智慧交通數據分析可視化系統 車流實時檢測分析 深度學習 車流量實時檢測跟蹤 軌跡跟蹤 畢業設計?

博主介紹&#xff1a;?全網粉絲50W&#xff0c;前互聯網大廠軟件研發、集結碩博英豪成立軟件開發工作室&#xff0c;專注于計算機相關專業項目實戰6年之久&#xff0c;累計開發項目作品上萬套。憑借豐富的經驗與專業實力&#xff0c;已幫助成千上萬的學生順利畢業&#xff0c;…

計算機視覺第一課opencv(四)保姆級教學

目錄 簡介 一、輪廓檢測 1.查找輪廓的API 2.代碼分析 2.1.圖像二值化處理 2.2輪廓檢測 2.3輪廓繪制 2.4輪廓面積計算 2.5輪廓周長計算 2.6篩選特定面積的輪廓 2.7查找最大面積的輪廓 2.8繪制輪廓的外接圓 2.9繪制輪廓的外接矩形 二、輪廓的近似 三、模板匹配 簡…

基于Vue2+elementUi實現樹形 橫向 合并 table不規則表格

1、實現效果 共N行&#xff0c;但是每一列對應的單元格列數固定&#xff0c;行數不固定2、實現方式說明&#xff1a;使用的是vue2 elementUI表格組件 js實現<template><div class"table-container" ><el-table height"100%" :span-metho…

深度學習在計算機視覺中的應用:對象檢測

引言 對象檢測是計算機視覺領域中的一項基礎任務&#xff0c;目標是在圖像或視頻幀中識別和定位感興趣的對象。隨著深度學習技術的發展&#xff0c;對象檢測的準確性和效率都有了顯著提升。本文將詳細介紹如何使用深度學習進行對象檢測&#xff0c;并提供一個實踐案例。 環境準…

node.js 安裝步驟

在Node.js中安裝包通常通過npm(Node Package Manager)來完成,這是Node.js的包管理工具。以下是安裝Node.js和通過npm安裝包的基本步驟: 1. 安裝Node.js 方法一:使用nvm(Node Version Manager) 推薦使用nvm來安裝Node.js,因為它允許你安裝多個Node.js版本,并輕松地在…

面試-故障案例解析

一、NFS故障&#xff0c;造成系統cpu使用率低而負載極高。故障概述: 公司使用NFS為web節點提供共享存儲服務,某一天下午發現web節點CPU使用率低,而負載極高.登錄web節點服務器排查發現后段NFS服務器故障. 影響范圍: 網站看不到圖片了。 處理流程: 通過ssh登錄NFS服務…

醫療AI時代的生物醫學Go編程:高性能計算與精準醫療的案例分析(一)

摘要: 隨著高通量測序、醫學影像和電子病歷等生物醫學數據的爆炸式增長,對高效、可靠、可擴展的計算工具需求日益迫切。Go語言憑借其原生并發模型、卓越的性能、簡潔的語法和強大的標準庫,在生物醫學信息學領域展現出獨特優勢。本文以“生物醫學Go編程探析”為主題,通過三個…

針對 “TCP 連接建立階段” 的攻擊

針對 “TCP 連接建立階段” 的攻擊一、定義二、共性防御思路三、攻擊手段3.1、SYN 洪水攻擊&#xff08;SYN Flood&#xff09;3.2、Land 攻擊&#xff08;Land Attack&#xff09;一、定義 什么是針對 “TCP 連接建立階段” 的攻擊&#xff1f;核心特征是利用 TCP “三次握手…

聊一聊 單體分布式 和 微服務分布式

微服務 與 單體架構對比維度單體架構微服務架構??架構本質??一個單一的、功能齊全的應用程序一組??小型、獨立??的服務集合??開發??團隊工作在同一個代碼庫&#xff0c;易產生沖突。技術棧統一。每個服務可以由?? 獨立的小團隊 ??負責&#xff0c;允許使用??…