Golang學習筆記_44——命令模式

Golang學習筆記_41——觀察者模式
Golang學習筆記_42——迭代器模式
Golang學習筆記_43——責任鏈模式


文章目錄

    • 一、核心概念
      • 1. 定義
      • 2. 解決的問題
      • 3. 核心角色
      • 4. 類圖
    • 二、特點分析
    • 三、適用場景
      • 1. 事務管理系統
      • 2. 多媒體遙控器
      • 3. 操作審計系統
    • 四、Go語言實現示例
    • 五、高級應用
      • 1. 宏命令系統
      • 2. 異步命令隊列
    • 六、與其他模式對比
    • 七、實現建議
    • 八、典型應用


一、核心概念

1. 定義

命令模式是一種行為型設計模式,通過將請求封裝為獨立對象實現調用者與執行者的解耦,支持請求的隊列化、撤銷重做和事務管理。其核心特點包括:
? 請求對象化:將操作抽象為可傳遞的命令對象
? 解耦調用鏈:調用者無需了解具體執行細節
? 操作可編排:支持命令的組合與順序控制

2. 解決的問題

? 系統緊耦合:消除行為請求者與實現者的直接依賴
? 操作不可逆:缺乏標準化的撤銷/重做機制
? 事務原子性:多步驟操作無法保證整體執行

3. 核心角色

角色作用
Command定義執行操作的統一接口(Execute/Undo)
ConcreteCommand實現具體命令邏輯,綁定接收者對象
Invoker觸發命令執行,支持命令存儲與調度
Receiver實際執行業務操作的對象
Client組裝命令對象與接收者的關系

4. 類圖

命令模式類圖

@startuml
' 命令模式類圖interface Command {+execute(): void
}class Invoker {-command: Command+setCommand(command: Command): void+executeCommand(): void
}class ConcreteCommand {-receiver: Receiver+execute(): void
}class Receiver {+action(): void
}' 關系定義
Command <|.. ConcreteCommand
Invoker o--> Command
ConcreteCommand --> Receiver
Receiver <.. ConcreteCommand : <<create>>note left of Command定義執行操作的接口
end notenote right of Receiver實際執行操作的對象
end note
@enduml

二、特點分析

優點

  1. 解耦架構:徹底分離請求發起方與執行方
  2. 可擴展性:新增命令不影響現有系統
  3. 事務支持:支持多命令原子操作與回滾

缺點

  1. 類膨脹:每個命令需獨立類實現
  2. 執行開銷:間接調用帶來性能損耗
  3. 復雜度:需處理命令生命周期管理

三、適用場景

1. 事務管理系統

// 轉賬命令示例
type TransferCommand struct {from   *Accountto     *Accountamount int
}func (t *TransferCommand) Execute() {t.from.Debit(t.amount)t.to.Credit(t.amount)
}func (t *TransferCommand) Undo() {t.from.Credit(t.amount)t.to.Debit(t.amount)
}

(實現資金劃轉與回滾,參考的撤銷實現)

2. 多媒體遙控器

type TVPowerCommand struct {tv *Television
}func (c *TVPowerCommand) Execute() {if c.tv.IsOn {c.tv.TurnOff()} else {c.tv.TurnOn()}
}

3. 操作審計系統

type AuditLog struct {commands []Command
}func (a *AuditLog) Record(cmd Command) {a.commands = append(a.commands, cmd)cmd.Execute()
}

四、Go語言實現示例

示例類圖

完整實現代碼

package command_demoimport "fmt"// Command 接口
type Command interface {Execute()
}// Receiver 實現
type StockTrade struct{}func (s *StockTrade) Buy() {fmt.Println("買入股票")
}func (s *StockTrade) Sell() {fmt.Println("賣出股票")
}// ConcreteCommand 具體命令
type BuyStock struct {stock *StockTrade
}func (b *BuyStock) Execute() {b.stock.Buy()
}type SellStock struct {stock *StockTrade
}func (s *SellStock) Execute() {s.stock.Sell()
}// Invoker 調用者
type Broker struct {orders []Command
}func (b *Broker) TakeOrder(cmd Command) {b.orders = append(b.orders, cmd)
}func (b *Broker) PlaceOrders() {for _, cmd := range b.orders {cmd.Execute()}b.orders = nil
}// 客戶端代碼
func Example() {stock := &StockTrade{}buy := &BuyStock{stock: stock}sell := &SellStock{stock: stock}broker := &Broker{}broker.TakeOrder(buy)broker.TakeOrder(sell)broker.PlaceOrders()
}

執行結果

=== RUN   TestExample
買入股票
賣出股票
--- PASS: TestExample (0.00s)
PASS

五、高級應用

1. 宏命令系統

type MacroCommand struct {commands []Command
}func (m *MacroCommand) Execute() {for _, cmd := range m.commands {cmd.Execute()}
}// 使用示例
macro := &MacroCommand{commands: []Command{&SaveCommand{},&CompileCommand{},&DeployCommand{},},
}
macro.Execute()

2. 異步命令隊列

type AsyncInvoker struct {queue chan Command
}func (a *AsyncInvoker) Start() {go func() {for cmd := range a.queue {cmd.Execute()}}()
}func (a *AsyncInvoker) Add(cmd Command) {a.queue <- cmd
}

六、與其他模式對比

模式核心區別典型應用場景
策略模式算法選擇 vs 操作封裝支付方式選擇
職責鏈模式請求傳遞 vs 命令執行審批流程處理
備忘錄模式狀態存儲 vs 操作記錄編輯器撤銷功能

七、實現建議

  1. 輕量化設計:使用閉包簡化簡單命令
    func NewLightCmd(light *Light) Command {return CommandFunc(light.Toggle)
    }
    
  2. 生命周期管理:實現Release()方法釋放資源
  3. 批量操作:采用組合模式實現命令集合操作
  4. 錯誤處理:增加Validate()預處理方法

八、典型應用

  1. 文本編輯器:實現編輯操作撤銷棧
  2. 智能家居:物聯網設備控制中心
  3. 金融交易:多步驟交易事務管理
  4. 游戲開發:玩家操作回放系統

通過命令模式,可以將分布式系統的操作請求轉化為可序列化對象,實現跨網絡的操作重放與審計。在Go語言中,結合channel特性可構建高性能命令管道,適用于實時交易系統等場景。建議對高頻操作命令采用對象池優化,避免重復創建開銷。

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

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

相關文章

應急響應--流量分析

&#xff08;一&#xff09;Cobalt Strike流量特征分析 1.HTTP特征 源碼特征&#xff1a; 在流量中&#xff0c;通過http協議的url路徑&#xff0c;在checksum8解密算法計算后&#xff0c;32位的后門得到的結果是92&#xff0c;64位的后門得到的結果是93&#xff0c;該特征符…

CI/CD—Jenkins配置一次完整的jar自動化發布流程

背景&#xff1a; 實現設想&#xff1a; 要創建自動化發布&#xff0c;需要準備一臺測試服務器提前安裝好java運行所需的環境&#xff0c;JDK版本最好和Windows開發機器上的版本一致&#xff0c;在Jenkins上配置將構建好的jar上傳到測試服務器上&#xff0c;測試服務器自動啟動…

創建分區表ORA-14037

1、故障現象 在跑腳本的時候創建物化試圖提示分區界限過高 2、解決方法 最終原因是&#xff1a;缺少了 這個 r34411分區&#xff0c;加上就好。 判斷是物化視圖創建的時候需要兼容所有分區的數據&#xff0c;所以報錯&#xff0c;而分區表則不存在這種情況 3、測試驗證 分區…

轉和git subtree管理方式為git submodule的管理方式

將 Git 子樹&#xff08;subtree&#xff09;轉換為子模塊&#xff08;submodule&#xff09;的步驟如下&#xff1a; 1. 確定子樹的路徑和對應的遠程倉庫地址 找到當前項目中子樹的路徑以及對應的遠程倉庫地址。例如&#xff0c;假設子樹的路徑為 subtree-folder&#xff0c…

基于51單片機多功能防盜報警系統

基于51單片機多功能防盜報警系統( proteus仿真程序設計報告原理圖講解視頻&#xff09; 1. 主要功能&#xff1a;2. 講解視頻&#xff1a;3. 仿真4. 程序代碼5. 設計報告6. 原理圖7. 設計資料內容清單&&下載鏈接 仿真圖proteus8.9及以上 程序編譯器&#xff1a;keil 4/…

R語言和RStudio安裝

整體還是比較簡單的&#xff0c;主要是記錄個流程。 官方鏡像站列表R語言官網 1 安裝R&#xff08;2025/3/6&#xff09; R語言官網&#xff1a;The R Project for Statistical Computing 打開之后就Hello world一下吧 配置環境變量 2 安裝RStudio 下載地址&#xff1a;htt…

Ubuntu 22.04 升級到 Ubuntu 24.04 全流程指南

&#x1f4cc; 1. 前言 Ubuntu 24.04 是最新的 LTS 版本&#xff0c;帶來了內核更新、性能優化以及更強的安全性。本指南詳細記錄了從 Ubuntu 22.04 升級到 24.04 的完整過程&#xff0c;包括 升級前的準備、遇到的問題及如何選擇最佳選項&#xff0c;避免升級失敗或系統損壞。…

【每日學點HarmonyOS Next知識】Web跨域資源、Web長按菜單、Web攔截請求、禁止錄屏、Base64圖片寬高

1、HarmonyOS Web組件本地資源跨域問題&#xff1f; 關于資源跨域問題的解決&#xff0c;可以參考以下官網文檔&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/web-cross-origin-V5 方法一 為了使Web組件能夠成功訪問跨域資源&#xff0c;開…

數據庫查問題常用OS命令匯總

1、內存使用情況查看 top //查看活躍進程占用情況 free -mh //查看操作系統當前可用內存 2、cpu使用情況 lscpu //查看os cpu情況 sar -u -f sar文件名 -s hh:mm:ss -e hh:mm:ss //查看對應日期的歷史cpu情況 top //查看當前活躍進程使用cpu情況 3、io情況 iostat …

nlp培訓重點-5

1. LoRA微調 loader&#xff1a; # -*- coding: utf-8 -*-import json import re import os import torch import numpy as np from torch.utils.data import Dataset, DataLoader from transformers import BertTokenizer """ 數據加載 """cl…

CI/CD—Jenkins配置Maven+GitLab自動構建jar包

一、安裝Maven插件通過Maven構建項目 1、在Jenkins上安裝Maven Integration plugin插件 2、創建一個maven項目 2.1、填寫構建的名稱和描述等 2.2、填寫連接git的url 報錯&#xff1a;無法連接倉庫&#xff1a;Error performing git command: git ls-remote -h http://192.168.…

ngx_regex_create_conf

ngx_regex_create_conf 定義在 src/core/ngx_regex.c static void * ngx_regex_create_conf(ngx_cycle_t *cycle) {ngx_regex_conf_t *rcf;ngx_pool_cleanup_t *cln;rcf ngx_pcalloc(cycle->pool, sizeof(ngx_regex_conf_t));if (rcf NULL) {return NULL;}rcf->p…

【數據結構】初識集合框架及背后的數據結構(簡單了解)

目錄 前言 如何學好數據結構 1. 什么是集合框架 2. 集合框架的重要性 3. 背后所涉及的數據結構以及算法 3.1 什么是數據結構 3.2 容器背后對應的數據結構 3.3 相關java知識 3.4 什么是算法 3.5 基本關系說明&#xff08;重要&#xff0c;簡單了解&#xff09; 前言 …

P9242 [藍橋杯 2023 省 B] 接龍數列--DP【巧妙解決接龍問題】

P9242 [藍橋杯 2023 省 B] 接龍數列--DP 題目 解析什么時候該用 DP&#xff1f;動態規劃 vs 其他方法代碼 題目 解析 這題沒思路&#xff0c;壓根沒想到DP &#x1f626; 看了大神的題解&#xff0c;利用dp記錄每一個數結尾的長度&#xff0c;最后再用N-dp中的最大值&#xf…

用《設計模式》的角度優化 “枚舉”

枚舉應該都有用過&#xff0c;枚舉主要的作用是為了方便用戶查找和引用枚舉。 案例一 下面的枚舉邏輯很簡單&#xff0c;就是通過枚舉值返回不同的結果。 public enum OperationEnum {EQUAL_TO,CONTAINS,START_WITH,END_WITH;public String getOperationValue(String value)…

SQL根據分隔符折分不同的內容放到臨時表

SQL Server存儲過程里根據分隔符折分不同的內容放到臨時表里做查詢條件&#xff0c;以下分隔符使用“/”&#xff0c;可修改不同分隔符 --根據分隔符折分不同的內容放到臨時表--------------- SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS id, LTRIM(RTR…

Ubuntu切換lowlatency內核

文章目錄 一. 前言二. 開發環境三. 具體操作 一. 前言 低延遲內核&#xff08;Lowlatency Kernel&#xff09; 旨在為需要低延遲響應的應用程序設計的內核版本。Linux-lowlatency特別適合音頻處理、實時計算、游戲和其他需要及時響應的實時任務。其主要特點是優化了中斷處理、調…

基于Django創建一個WEB后端框架(DjangoRestFramework+MySQL)流程

一、Django項目初始化 1.創建Django項目 Django-admin startproject 項目名 2.安裝 djangorestframework pip install djangorestframework 解釋: Django REST Framework (DRF) 是基于 Django 框架的一個強大的 Web API 框架&#xff0c;提供了多種工具和庫來構建 RESTf…

VUE3開發-9、axios前后端跨域問題解決方案

VUE前端解決跨域問題 前端頁面需要改寫 如果無效&#xff0c;記得重啟服務器 后端c#解決跨域問題 前端js取值&#xff0c;后端c#跨域_c# js跨域-CSDN博客

DailyNotes 增加提醒功能

TODO&#xff1a;準備給 DailyNotes 增加一個提醒功能&#xff0c;準備接入 AI 來做一些事情。試了一下&#xff0c;非常靠譜。 具體 DailyNotes 和 Ollama 的交互方式&#xff0c;可以直接調用命令行&#xff0c;也可以走網絡API。 rayuK2CD9WCYN4 ~ % ollama run deepseek-…