本文為簡(jiǎn)述程序設(shè)計(jì)的設(shè)計(jì)模式之一,非普及文章,專業(yè)的朋友略看即可。
命令模式
命令模式是指,使用者向接收者發(fā)送命令,使用者并不清楚命令如何執(zhí)行,也不管是怎樣的過程。
在實(shí)際生活中,音樂播放器就可以看成一個(gè)命令模式的設(shè)計(jì)。我們并不知道如何播放一首歌曲,只需要點(diǎn)擊按鈕命令即可。至于播放的是MP3還是OGG,如何解碼音頻,數(shù)據(jù)如何送達(dá)DSP,如何將聲音轉(zhuǎn)成模擬信號(hào)從揚(yáng)聲器輸出等待,我們都不需要知道。

播放器
命令模式實(shí)現(xiàn)
1.定義全局變量標(biāo)志,比如【Play】、【Pause】、【Next】等。
2.請(qǐng)求方只發(fā)送命令:【Play】、【Pause】、【Next】。
3.接收方解析命令,并調(diào)用對(duì)應(yīng)的流程實(shí)現(xiàn)具體功能。
除了選擇不同的命令之外,還可以選擇不同的接收者。比如我們需要播放音頻和視頻,分別要使用音頻播放器和視頻播放器,但是對(duì)于上層的命令是一樣的。既然我可以不管MP3還是WMA,我也可以不管這是MP3還是MP4,甚至是PPT。對(duì)于用戶講,我可以直接根據(jù)文件后綴來(lái)判斷我應(yīng)該啟動(dòng)和中關(guān)聯(lián)程序。
對(duì)!電腦上雙擊文件就打開的功能就是這樣做的。如果后綴名錯(cuò)了,一般無(wú)法自動(dòng)打開,需要手動(dòng)選擇打開方式。


選擇不同的命令解析者和接收者
命令模式的使用場(chǎng)景
只要你認(rèn)為是命令的地方就可以采用命令模式,例如,在GUI開發(fā)中,一個(gè)按鈕的點(diǎn)擊是一個(gè)命令,可以采用命令模式;模擬DOS命令的時(shí)候,當(dāng)然也要采用命令模式;觸發(fā)-反饋機(jī)制的處理等。
擴(kuò)展與撤銷
我們可以在已有流程上擴(kuò)展命令。比如播放音樂,開啟空調(diào),開啟電燈,進(jìn)入回家模式。或者相反進(jìn)入出門模式,把所有的電器關(guān)閉。
此時(shí),可以創(chuàng)建新的接收者,讓新的解析器逐步處理。
撤銷類似,記錄之前的狀態(tài)并還原。
當(dāng)然,實(shí)際編程中,我們一般會(huì)省略設(shè)置和執(zhí)行的分布,不需要先設(shè)置后執(zhí)行,而是設(shè)置了就馬上自動(dòng)執(zhí)行。

參考資料
對(duì),我最初看得是這本書。

實(shí)際上這一章看了很久,原因是書中的舉例太復(fù)雜,描述又不清楚。很多描述用英文原文翻譯出來(lái)讓人一頭霧水。舉例來(lái)說(shuō),在《UML 建模、設(shè)計(jì)與分析》一書中:
4.3.1 依賴關(guān)系
模型元素之間的依賴關(guān)系描述的是它們之間語(yǔ)義上的關(guān)系。當(dāng)兩個(gè)元素處于依賴關(guān)系中時(shí),其中一個(gè)元素的改變可能會(huì)影響或提供消息給另一個(gè)元素,即一個(gè)元素以某種形式依賴于另一元素。?
看明白了嗎?沒有。實(shí)際上,我來(lái)寫的話,會(huì)這樣描述:
依賴關(guān)系是指,A了解B的使用方法和內(nèi)容,在特定情況下需要用到B的方法和內(nèi)容。比如司機(jī)和汽車,醫(yī)生和聽診器,藍(lán)翔同學(xué)和挖掘機(jī)。
總的來(lái)說(shuō),命令模式在Head First 設(shè)計(jì)模式中描述的并不好,所以我參考了以下書籍。

當(dāng)然,還有百科全書:菜鳥教程。