命令模式是行為型模式的一種捻艳,同時屬于行為模式的還有:狀態(tài)模式,觀察者模式庆猫,策略模式和之前寫的中介者模式认轨。
什么是命令模式?什么時候需要使用命令模式月培?
命令模式是通過命令發(fā)送者和命令執(zhí)行者的解耦來完成對命令的具體控制的嘁字。 命令模式是對功能方法的抽象恩急,并不是對對象的抽象。命令模式是將功能提升到對象來操作纪蜒,以便對多個功能進(jìn)行一系列的處理以及封裝衷恭。任何模式的出現(xiàn),都是為了解決一些特定的場景的耦合問題纯续,以達(dá)到對修改封閉随珠,對擴(kuò)展開放的效果。命令模式是為了解決命令的請求者和命令的實現(xiàn)者之間的耦合關(guān)系猬错,或者說當(dāng)你需求中有明確的添加撤銷工作時牙丽,可以考慮命令模式。
命令模式的優(yōu)點(diǎn)
類間解耦:調(diào)用者角色與接收者角色之間沒有任何依賴關(guān)系兔魂,調(diào)用者實現(xiàn)功能時只需調(diào)用Command 抽象類的execute方法就可以烤芦,不需要了解到底是哪個接收者執(zhí)行∥鲂#可擴(kuò)展性:Command的子類可以非常容易地擴(kuò)展构罗,而調(diào)用者Invoker和高層次的模塊Client不產(chǎn)生嚴(yán) 重的代碼耦合。命令模式結(jié)合其他模式會更優(yōu)秀:命令模式可以結(jié)合責(zé)任鏈模式智玻,實現(xiàn)命令族解析任務(wù)遂唧;結(jié)合模板方法模式,則可以減少 Command子類的膨脹問題吊奢。
命令模式和策略模式
他們兩者在類圖上非常相似
● 關(guān)注點(diǎn)不同:策略模式關(guān)注的是算法替換的問題盖彭,一個新的算法投產(chǎn),舊算法退休页滚,或者提供多種算法由調(diào)用者自己選擇使用召边,算法的自由更替是它實現(xiàn)的要點(diǎn)。換句話說裹驰,策略模式關(guān)注的是算法的完整性隧熙、封裝性,只有具備了這兩個條件才能保證其可以自由切換幻林。命令模式則關(guān)注的是解耦問題贞盯,如何讓請求者和執(zhí)行者解耦是它需要首先解決的,解耦的要求就是把請求的內(nèi)容封裝為一個一個的命令沪饺,由接收者執(zhí)行躏敢。由于封裝成了命令,就同時可以對命令進(jìn)行多種處理整葡,例如撤銷件余、記錄等。
● 角色功能不同:在我們的例子中,策略模式中的抽象算法和具體算法與命令模式的接收者非常相似蛾扇,但是它們的職責(zé)不同攘烛。策略模式中的具體算法是負(fù)責(zé)一個完整算法邏輯魏滚,它是不可再拆分的原子業(yè)務(wù)單元镀首,一旦變更就是對算法整體的變更。而命令模式則不同鼠次,它關(guān)注命令的實現(xiàn)更哄,也就是功能的實現(xiàn)。例如我們在分支中也提到接收者的變更問題腥寇,它只影響到命令族的變更成翩,對請求者沒有任何影響,從這方面來說赦役,接收者對命令負(fù)責(zé)麻敌,而與請求者無關(guān)。命令模式中的接收者只要符合六大設(shè)計原則掂摔,完全不用關(guān)心它是否完成了一個具體邏輯术羔,它的影響范圍也僅僅是抽象命令和具體命令,對它的修改不會擴(kuò)散到模式外的模塊乙漓。當(dāng)然级历,如果在命令模式中需要指定接收者,則需要考慮接收者的變化和封裝叭披,例如一個老顧客每次吃飯都點(diǎn)同一個廚師的飯菜寥殖,那就必須考慮接收者的抽象化問題。
● 使用場景不同:策略模式適用于算法要求變換的場景涩蜘,而命令模式適用于解耦兩個有緊耦合關(guān)系的對象場合或者多命令多撤銷的場景嚼贡。