設計模式之命令模式

2022-09-19 05:18:10 字數 1832 閱讀 3246

命令模式(command)的定義是:用於將乙個請求封裝成乙個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或者記錄請求日誌,以及執行可撤銷的操作。也就是說改模式旨在將函式的呼叫、請求和操作封裝成乙個單一的物件,然後對這個物件進行一系列的處理。此外,可以通過呼叫實現具體函式的物件來解耦命令物件與接收物件。

假設有乙個快餐店,而我是該餐廳的點餐服務員,那麼我一天的工作應該是這樣的:當某位客人點餐或者打來訂餐**後,我會把他的需求都寫在清單上,然後交給廚房,客人不用關心是哪些廚師幫他炒菜。我們餐廳還可以滿足客人需要的定時服務,比如客人可能當前正在回家的路上,要求 1 個小時後才開始炒他的菜,只要訂單還在,廚師就不會忘記。客人也可以很方便地打**來撤銷訂單。另外如果有太多的客人點餐,廚房可以按照訂單的順序排隊炒菜。

點選按鈕 1

點選按鈕 2

點選按鈕 3

接下來定義 setcommand 函式,setcommand 函式負責往按鈕上面安裝命令。可以肯定的是,點選按鈕會執行某個 command 命令,執行命令的動作被約定為呼叫 command 物件的 execute()方法。雖然還不知道這些命令究竟代表什麼操作,但負責繪製按鈕的程式設計師不關心這些事情,他只需要預留好安裝命令的介面,command 物件自然知道如何和正確的物件溝通:

var setcommand = function( button, command )

};

現在將重新整理選單介面、增加子選單和刪除子選單這幾個功能,這幾個功能被分布在 menubar 和 submenu 這兩個物件中:

var menubar = 

};var submenu = ,

del: function()

};

如果我們要將button和命令結合起來,把這些行為都封裝在命令類中

var refreshmenubarcommand = function( receiver );

refreshmenubarcommand.prototype.execute = function();

var addsubmenucommand = function( receiver );

addsubmenucommand.prototype.execute = function();

var delsubmenucommand = function( receiver );

delsubmenucommand.prototype.execute = function();

最後就是把命令接收者傳入到 command 物件中,並且把 command 物件安裝到 button 上面:

var refreshmenubarcommand = new refreshmenubarcommand( menubar );

var addsubmenucommand = new addsubmenucommand( submenu );

var delsubmenucommand = new delsubmenucommand( submenu );

setcommand( button1, refreshmenubarcommand );

setcommand( button2, addsubmenucommand );

setcommand( button3, delsubmenucommand );

設計模式之命令設計模式

先來看一下命令模式的類圖 乍一看好像類很多,其實我們逐個分析他們。類圖中存在的類可以分為 invoker icommand conceretecommand receiver invoker類 上層直接調取invoker類 icommand 是對命令的抽象 conceretecommand 是命令的...

設計模式之命令模式

command pattern 將請求封裝成物件,這可以讓你使用不同的請求,佇列,或者是日誌請求來引數化其他物件,命令模式也可以支援撤銷操作。命令模式有兩種實現方式 1.在命令管理器中提供設定當前命令接受者的方法,當執行訊息或者是有訊息壓入的時候直接將命令傳送給當前設定的接受者。2.在命令管理器中建...

設計模式之命令模式

當我們有一台多功能的印表機,然後通過電腦直接進行任務,如圖 如果通過這樣的設計直接去呼叫多功能一體機的功能,就會存在此時此刻只能進行乙個任務,不允許有多個客戶端同時操作.那麼現在我們就需要考慮一種新的設計模式,叫做命令設計模式。命令設計模式 將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行...