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
英文地址,請注明出處:http://en.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:/…