古典名著看設計模式 – 王熙鳳調度理家 — 命令 (Command) 模式

前言

在軟體系統中,常常需要將「發出請求的物件」與「執行請求的物件」解耦合。例如,使用者介面上的按鈕、選單等UI元件,可能需要觸發各種不同的操作 (如儲存、列印等),但這些元件本身不應直接包含業務邏輯。傳統做法往往在發送者中直接呼叫接收者的方法,或以 if-else、switch-case 等條件判斷來分派操作,這會導致程式碼耦合度高、難以維護與擴展。

命令模式(Command Pattern)正是為了解決這類問題而設計。它將每一個請求封裝為獨立的命令物件,讓發送者與接收者之間完全解耦。發送者只需知道如何發出命令,不需關心命令如何被執行;而接收者則專注於具體的業務邏輯。這種設計不僅提升了系統的靈活性,也便於實現命令的排隊、撤銷、重做、日誌記錄等進階功能。

以《紅樓夢》中的王熙鳳為例,她作為榮國府的總管,負責調度府中大小事務。王熙鳳本人並不直接執行具體任務,而是發出各種命令;府中的管家與僕從則負責具體執行。這種「發出命令與執行命令分離」的特性正體現了 Command 模式的精髓。

王熙鳳調度理家 — 命令模式

「王夫人因王熙鳳是賈璉之妻,賈璉是賈政之子,又是賈母的內孫,才干又敏捷,見人說話,賈母王夫人都喜歡她,因此便把榮國府中一應大小事務俱交與她裡裡外外經管。」
- 命令的調用者

「鳳姐兒道:『你們各房裡的人都齊了嗎?』眾人道:『都齊了。』鳳姐兒道:『那麼我分派給你們,各人各管一處地方,一應打掃收拾,務要乾淨。』說著,便一一的分派開了。」
- 調用者與接收者的解耦合

「鳳姐兒吩咐林之孝家的道:『你傳出去,叫廚房裡預備酒席,就在大觀園的稻香村裡擺著。』林之孝家的領命而去,隨即又回來稟道:『廚房裡說,還要知道擺幾席才好預備。』鳳姐兒道:『你難道連這個也不知道?擺八席就是了。』」
- 命令的層級傳遞

命令模式的範例 - 王熙鳳調度理家

《紅樓夢》中,王熙鳳是榮國府的執行長CEO,以鐵腕手段與靈活策略統籌全府資源,將家族企業管理得井井有條的女強人。其中,王熙鳳調度理家的場景完美展現了 Command 設計模式的核心思想。王熙鳳作為命令的調用者 (Invoker),不直接執行具體任務,而是發出各種命令;府中的管家與僕從們則作為命令的接收者 (Receiver),負責具體執行。

這種結構體現了 Command 模式中調用者與接收者的解耦合原則。王熙鳳只需發出指令,不必關心具體執行細節;而各個下人只需專注於自己負責的任務,不必了解整體安排。當王熙鳳吩咐林之孝家的傳達擺席命令時,展示了命令的層級傳遞特性,林之孝家的充當了命令的中轉站。

下圖使用UML物件溝通 (communication) 圖表達王熙鳳理家命令模式的各類型物件互動關係。

命令模式的範例 - 王熙鳳調度理家

這些物件類型可以對應在命令模式主要參與者的角色:

  • Client (王夫人):提出家務管理需求,她並不直接參與命令調派與執行,只提出需求。
  • Invoker (王熙鳳)
    • 命令的調用者 (invoker),負責府中內務管理決策。
    • 決定分派命令的工作事項,如清理打掃、安排宴席等。
    • 只負責指揮調度,不直接參與具體命令的執行。
  • Abstract Command (府中差事):只定義抽象命令的執行與其它操作 (如撤銷),具體的執行項目,需要由具體命令來實現。
  • Concrete Command (清理打掃、安排宴席):具體執行所交付特定工作的命令,例如安排宴席、府內清理、採買用品 …等。
  • Receiver (管家與僕從):命令的接收並執行對應的操作。同是接收者,但管家可以再分派工作給僕從,形成了階層式的接收關係。

Command 模式核心概念

Command 模式是一種行為型 (behavioral) 設計模式,其目的是將請求封裝成物件,從而使發送請求的物件與執行請求的物件解耦合,並支持可撤銷的操作。

Command 模式的主要特點包括:

  • 封裝性:將請求封裝為物件,使請求的發送者與接收者完全分離,發送者無需知道接收者如何處理請求。
  • 統一介面:所有命令都實作共同的介面,調用者可用一致方式調用不同命令。
  • 參數化:將請求轉換為物件,使其能像參數一樣被傳遞,從而用不同命令物件動態配置調用者的行為。
  • 擴展性:可以方便地新增命令類別,而不需要修改現有程式碼,符合開放封閉原則。
  • 進階功能:命令物件可支援撤銷 (Undo)、重做 (Redo)、巨集命令、命令日誌等進階操作。

Command 模式的典型實現包含四個核心元素:命令介面 (Command)、具體命令 (ConcreteCommand)、調用者 (Invoker) 和接收者 (Receiver)。命令介面定義了執行操作的方法,具體命令實現該介面並關聯特定接收者,調用者負責觸發命令的執行,而接收者則實現實際的業務邏輯。

Command 模式特別適用於需要將操作參數化、支援撤銷/重做、操作排隊、日誌記錄等場景。透過命令模式,系統能夠靈活地管理各種操作,並大幅提升可維護性與擴展性。

效果、應用時機與其它應用實例

效果

  • 調用者與接收者解耦,提升系統靈活性。
  • 命令封裝,便於儲存、傳遞、排隊、撤銷與記錄。
  • 易於擴展新命令,符合開放封閉原則。
  • 支援複合命令 (巨集命令)、操作日誌等進階功能。

應用時機

  • 需要參數化物件操作、支援撤銷/重做、操作排隊、日誌記錄等場景。
  • UI 元件、文件操作、遊戲引擎、自動化測試、遠程服務調用等。

其它應用案例

  • 圖形介面按鈕與選單操作。
  • 文件系統的開啟、儲存、列印等操作。
  • 遊戲動作記錄與回放。
  • 自動化測試腳本錄製與回放。
  • 遠程服務請求的封裝與管理。

留下第一條留言