分類

行為型模式。

這個模式在解決什麼

命令模式要解決的是「請求本身需要被管理」的問題。當一個動作不只是立刻執行,而是可能需要排隊、撤銷、延後、重播或記錄時,把它直接寫成普通函數調用就不夠用了。

核心做法

它會把一次操作封裝成命令對象。命令對象通常包含:

  • 要操作的目標
  • 執行這個操作所需的資料
  • 執行入口

這樣一來,調用者就不需要知道底層細節,只要收集並安排命令即可。

什麼時候適合用

下面幾類場景很典型:

  • 需要把操作排成隊列依次執行
  • 需要支持撤銷 / 重做
  • 需要把操作記錄下來,日後重播
  • 想把「發出請求的人」與「真正執行請求的人」解耦

例子

回合制遊戲裡,玩家可能在很短時間內連續打出多張手牌。玩家不會等到場上角色把所有動畫播完才做下一步輸入,所以系統需要把這些行動暫存起來,再按照自己的節奏逐條執行。

這時就可以把每次出牌封裝成一個命令對象,放進命令隊列裡。玩家只負責提交命令,遊戲流程則負責控制它們何時被真正執行。

類圖

這一篇先記住的重點

  • 命令模式的核心不是「調用方法」,而是「把請求本身變成對象」
  • 一旦請求被物件化,就能做排隊、撤銷、記錄與重播
  • 它很適合節奏與執行時機不完全由輸入方決定的系統

參考書目

《Head First Design Patterns》Eric Freeman, Elisabeth Robson, Kathy Sierra, Bert Bates