行為模式-命令模式

定義:

????????命令模式是一個高內聚的模式,其定義為:Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.(將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請 求排隊或者記錄請求日志,可以提供命令的撤銷和恢復功能。)

命令模式通用類圖

????????命令設計模式的核心思想是“封裝請求”。它把每個具體的操作(如打開文件、刪除數據、執行計算等)都封裝成一個獨立的命令對象。這些命令對象實現統一的接口,包含執行操作的方法。請求的發送者(如用戶界面的按鈕點擊事件)只需要與命令對象交互,而無需知道具體的操作是由哪個接收者(如文件系統模塊、數據庫操作類)執行的。這樣,系統可以方便地對命令進行組合、管理和擴展,例如實現命令的撤銷、重做、隊列化執行等功能 。

角色:

責任鏈模式包含以下幾個核心角色:

(一)命令接口(Command)

????????命令接口定義了執行命令的抽象方法execute(),所有具體命令類都必須實現該接口。通過統一的接口,使得不同類型的命令可以被一致地處理。

(二)具體命令類(Concrete Command)

????????具體命令類是命令接口的實現類,它持有一個接收者對象的引用,并在execute()方法中調用接收者的相關方法,完成具體的操作。例如,“打開文件” 命令類會調用文件系統類的打開文件方法。

(三)接收者(Receiver)

????????接收者是真正執行命令操作的對象,它包含了具體的業務邏輯。每個具體命令類都會關聯一個接收者,通過調用接收者的方法來實現命令的功能。

(四)調用者(Invoker)

????????調用者也稱為請求發送者,它持有命令對象的引用,并通過調用命令對象的execute()方法來觸發命令的執行。調用者不關心命令的具體實現,只負責發起請求。例如,遙控器上的按鈕就是調用者,它觸發對應的命令對象執行操作。

(五)客戶端(Client)

????????客戶端負責創建具體命令對象和調用者對象,并將命令對象與調用者進行關聯。客戶端決定了哪些命令會被執行,以及如何組織這些命令 。

代碼示例:

假設我們有一個遙控器,可以控制電視和電燈的開關,使用命令設計模式實現該場景。

// 接收者:電視類

public class Television {public void turnOn() {System.out.println("電視已打開");}public void turnOff() {System.out.println("電視已關閉");}}

// 接收者:電燈類

public class Light {public void turnOn() {System.out.println("電燈已打開");}public void turnOff() {System.out.println("電燈已關閉");}}

// 命令接口

public interface Command {void execute();}

// 具體命令類:打開電視命令

public class TurnOnTelevisionCommand implements Command {private Television television;public TurnOnTelevisionCommand(Television television) {this.television = television;}@Overridepublic void execute() {television.turnOn();}}

// 具體命令類:關閉電視命令

public class TurnOffTelevisionCommand implements Command {private Television television;public TurnOffTelevisionCommand(Television television) {this.television = television;}@Overridepublic void execute() {television.turnOff();}}

// 具體命令類:打開電燈命令

public class TurnOnLightCommand implements Command {private Light light;public TurnOnLightCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}}

// 具體命令類:關閉電燈命令

public class TurnOffLightCommand implements Command {private Light light;public TurnOffLightCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}}

// 調用者:遙控器類

public class RemoteControl {private Command onCommand;private Command offCommand;public RemoteControl(Command onCommand, Command offCommand) {this.onCommand = onCommand;this.offCommand = offCommand;}public void pressOnButton() {onCommand.execute();}public void pressOffButton() {offCommand.execute();}}

// 客戶端代碼

public class CommandPatternClient {public static void main(String[] args) {Television television = new Television();Light light = new Light();Command turnOnTelevisionCommand = new TurnOnTelevisionCommand(television);Command turnOffTelevisionCommand = new TurnOffTelevisionCommand(television);Command turnOnLightCommand = new TurnOnLightCommand(light);Command turnOffLightCommand = new TurnOffLightCommand(light);RemoteControl tvRemote = new RemoteControl(turnOnTelevisionCommand, turnOffTelevisionCommand);RemoteControl lightRemote = new RemoteControl(turnOnLightCommand, turnOffLightCommand);System.out.println("------ 操作電視 ------");tvRemote.pressOnButton();tvRemote.pressOffButton();System.out.println("\n------ 操作電燈 ------");lightRemote.pressOnButton();lightRemote.pressOffButton();}}

優點?:

1、解耦發送者和接收者:命令模式將請求的發送者和接收者分離,降低了兩者之間的耦合度,使代碼結構更加清晰,易于維護和擴展。

2、支持靈活的命令組合:可以將多個命令組合成復合命令,實現復雜的操作邏輯。例如,在游戲中可以將移動、攻擊等多個命令組合成一個連招命令。

3、方便實現撤銷和重做:通過在命令對象中添加撤銷和重做方法,可以輕松實現操作的撤銷和重做功能,提升用戶體驗。

4、支持請求的隊列化和日志記錄:命令對象可以方便地被放入隊列中進行管理,同時記錄命令的執行信息,實現操作的日志記錄和審計。


缺點:

1、增加類的數量:命令設計模式需要定義命令接口、具體命令類等多個類,會增加系統的類數量,使代碼結構變得復雜。

2、可能導致過度設計:對于簡單的請求操作,使用命令模式可能會顯得過于繁瑣,增加不必要的開發成本。在這種情況下,直接調用接收者的方法可能更加簡單高效。


使用場景:?

(一)需要支持撤銷和重做功能

????????由于命令對象封裝了操作的細節,我們可以在命令類中添加undo()和redo()方法,方便實現撤銷和重做操作。例如,文本編輯器中的撤銷 / 重做功能就可以通過命令模式實現。

(二)請求排隊或延遲執行

????????可以將命令對象放入隊列中,按照一定的順序執行,或者在合適的時機延遲執行。例如,在多線程任務調度、數據庫事務處理等場景中,命令模式可以很好地管理請求的執行順序。

(三)請求的發送者和接收者解耦

????????當請求的發送者和接收者之間存在復雜的依賴關系,或者需要降低它們之間的耦合度時,命令模式可以將請求封裝成對象,使兩者之間的關系更加清晰。例如,在圖形界面應用中,按鈕點擊事件(發送者)和具體的業務邏輯(接收者)可以通過命令對象進行解耦。

(四)實現日志記錄和審計功能

????????通過記錄命令對象的執行信息,可以實現操作日志的記錄,方便后續的審計和故障排查。例如,在銀行系統中,每一筆交易操作都可以封裝成命令對象,記錄交易詳情和操作時間。

????????命令設計模式通過將請求封裝為對象,為我們提供了一種強大而靈活的編程方式。它有效解耦了請求的發送者和接收者,使系統更易于維護和擴展,同時支持撤銷、重做、隊列化等高級功能。在實際開發中,當遇到需要處理復雜請求、實現操作管理和擴展功能的場景時,不妨考慮使用命令設計模式。但也要注意避免過度設計,根據具體需求選擇合適的解決方案。掌握命令設計模式,將為你的代碼設計帶來更多的可能性和靈活性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86768.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86768.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86768.shtml

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

相關文章

Ubuntu 24.04 上安裝與 Docker 部署 Sentinel

Ubuntu 24.04 上安裝與 Docker 部署 Sentinel 一、Sentinel 簡介 Sentinel 是阿里巴巴開源的分布式系統流量控制組件,提供流量控制、熔斷降級和系統負載保護等功能。它通過可視化控制臺(Dashboard)實現實時監控和規則管理,是微服…

IP 地址查詢在證券交易中的應用方式

網絡安全保障與IP地址查詢 證券交易平臺存儲著海量投資者的敏感信息以及巨額資金的交易數據,是網絡攻擊的重點目標。IP 地址查詢在檢測異常登錄行為方面至關重要。例如,當一個賬戶短時間內先在國內某城市登錄,隨后又在境外 IP 地址發起交易操…

Flutter 常用組件詳解:Text、Button、Image、ListView 和 GridView

Flutter 作為 Google 推出的跨平臺 UI 框架,憑借其高效的渲染性能和豐富的組件庫,已經成為移動應用開發的熱門選擇。本文將深入探討 Flutter 中最常用的五個基礎組件:Text、Button、Image、ListView 和 GridView,幫助開發者快速掌…

docker 單機部署redis集群(一)

docker 部署redis集群 1、創建redis網卡 docker network create redis --subnet 172.38.0.0/16查看網卡信息 docker network ls docker network inspect redis2、創建redis配置 #使用腳本創建6個redis配置for port in $(seq

MySQL 索引學習筆記

1.二叉樹,紅黑樹,B 樹,B樹 二叉樹:就是每個節點最多只能有兩個子節點的樹; 紅黑樹:就是自平衡二叉搜索樹,紅黑樹通過一下五個規則構建: 1.節點只能是紅色或黑色; 2.根…

Windows安裝docker及使用

下載 https://www.docker.com/ 安裝 啟動 此時拉取鏡像會報錯 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 配置引擎 添加以…

多參表達式Hive UDF

支持的操作符 :跳過,即無條件篩選:等于!:不等于range:區間內,range[n,m]表示 between n and mnrange:區間外,即not between andin:集合內,in(n,m,j,k)表示 in…

GO后端開發內存管理及參考答案

什么是 Go 的逃逸分析(Escape Analysis),為什么需要它? Go 的逃逸分析是一種編譯時技術,用于確定變量的生命周期是否超出其創建的函數作用域。通過分析變量的使用方式,編譯器能夠判斷變量是否需要在堆上分…

未來智能系統演進路線:從AGI到ASI的技術藍圖

引言:智能革命的下一個十年 在AI技術突破性發展的當下,我們正站在通用人工智能(AGI)向人工超級智能(ASI)躍遷的關鍵轉折點。本文將系統解析未來3-10年的技術演進路徑,通過模塊化組件插件&#…

eNSP-Cloud(實現本地電腦與eNSP內設備之間通信)

說明: 想象一下,你正在用eNSP搭建一個虛擬的網絡世界,里面有虛擬的路由器、交換機、電腦(PC)等等。這些設備都在你的電腦里面“運行”,它們之間可以互相通信,就像一個封閉的小王國。 但是&#…

AI Agent 核心策略解析:Function Calling 與 ReAct 的設計哲學與應用實踐

引言 在人工智能助手和自主Agent快速發展的今天,如何讓AI系統不僅能夠理解復雜指令,還能有效地執行任務并適應動態環境,成為技術演進的關鍵問題。本文將深入探討兩種核心的Agent設計策略:Function Calling(函數調用&a…

window下配置ssh免密登錄服務器

window下配置ssh免密登錄服務器 本地windows遠程登錄我的ssh服務器10.10.101.xx服務器,想要每次都免密登錄這個服務器. 記錄下教程,防止后期忘記,指導我實現這個過程。 教程 二、實踐步驟:Windows 上配置 SSH 免密登錄 2.1 確…

樹莓派5實現串口通信教程

1,安裝依賴 確保已經安裝 pyserial: pip3 install pyserial 如果無法用pip3安裝,那就創建一個虛擬環境進行安裝 如果你想安裝最新版本的 pyserial 或其它非 Debian 打包的庫,建議在用戶目錄下創建一個虛擬環境: 安裝…

(五)Linux性能優化-CPU-性能優化

性能優化文章參考倪朋飛老師的Linux性能優化實戰課程 性能優化方法論 Q:怎么評估性能優化的效果? A:對系統的性能指標進行量化,并且要分別測試出優化前、后的性能指標,用前后指標的變化來對比呈現效果。確定性能的量…

ThreadLocal原理及內存泄漏分析

介紹 每個線程內部都有一個私有的 ThreadLocalMap 實例&#xff0c;用于存儲該線程關聯的所有 ThreadLocal 變量。 ThreadLocalMap 內部的 Entry 繼承自 WeakReference<ThreadLocal<?>>。所以**Entry 的 key&#xff08;即 ThreadLocal 對象本身&#xff09;是通…

Oracle OCP認證考試考點詳解083系列18

題記&#xff1a; 本系列主要講解Oracle OCP認證考試考點&#xff08;題目&#xff09;&#xff0c;適用于19C/21C,跟著學OCP考試必過。 86. 第86題&#xff1a; 題目 解析及答案&#xff1a; 86、使用FLASHBACK TABLE的兩個先決條件是什么&#xff1f; A&#xff09;必須對…

git merge合并分支push報錯:Your branch is ahead of ‘xxx‘ by xx commits.

git merge合并分支push報錯&#xff1a;Your branch is ahead of xxx by xx commits. Your branch is ahead of xxx by xx commits.(use "git push" to publish your local commits)解決方案&#xff1a; git checkout 到要合入的分支&#xff0c;然后&#xff1a; …

英語作文模板

核心原則&#xff1a;三段式結構 ?英文: The core principle is a three-paragraph structure (Introductory paragraph Main body paragraph Concluding paragraph).?中文: 核心原則是采用三段式結構&#xff08;開頭引論段 中間主體段 結尾總結段&#xff09;。 模板 …

[安卓按鍵精靈輔助工具]一些安卓端可以用的雷電模擬器adb命令

在雷電論壇上看到很多adb命令&#xff0c;不過并沒有針對安卓按鍵進行處理&#xff0c;這里做了一下測試&#xff0c;把能用在安卓按鍵上的adb命令整理出來。 調用adb命令使用的山海插件中的Execute 執行shell命令 adb命令源碼如下&#xff1a; Import "shanhai.lua&quo…

uni-app項目怎么實現多服務環境切換

前情 uni-app是我比較喜歡的跨平臺框架&#xff0c;它能開發小程序/H5/APP(安卓/iOS)&#xff0c;重要的是對前端開發友好&#xff0c;自帶的IDE可視化的運行和打包也讓開發體驗也非常棒&#xff0c;公司項目就是主推uni-app&#xff0c;現在我的開發模式是用HBuilder X跑項目…