“Head First 設計模式“ :命令模式

命令模式


命令模式定義:將“請求”封裝成對象,以便使用不同的請求、隊列或者日誌來參數化其他對象。命令模式也支持可撤銷的操作。
命令模式,封裝方法調用,命令模式可將“動作的請求者”從“動作的執行者”對象中解耦。類圖,如下:

“Head First 設計模式“ :命令模式


生活中例子:餐廳點菜(顧客,服務員,廚師關係,顧客訂單告訴服務員就是,不用直接廚師打交道,廚師收到服務員的發來的訂單後開始做好大餐)。


命令模式的優點
● 在命令模式中, 請求者不直接與接收者交互, 即請求者不包含接收者的引用, 因此徹底消除了彼此之間的耦合.
● 命令模式滿足"開-閉"原則. 如果增加新的具體命令和該命令的接收者, 不必修改調用者的代碼, 調用者就可以使用新的命令對象; 反之, 如果增加新的調用者, 不必修改現有的具體命令和接收者, 新增加的調用者就可以使用自己已有的具體命令
● 由於請求者被封裝到了具體命令中, 那麼就可以將具體命令保存到持久化的媒介中, 在需要的時候, 重新執行這個具體命令. 因此使用命令模式可以記錄日誌.
● 使用命令模式可以對請求者的"請求"進行排隊. 每個請求都各自對應一個具體命令,因此可以按照一定的順序執行這些命令.


命令模式的使用場景
● 命令模式將發出請求的對象和執行請求的對象進行解耦
● 用於隊列請求,命令對象和一般對象一樣可以被傳來傳去,只要實現統一的接口方法,可以被任意調用
● 用於日誌請求,將所有動作記錄在日誌中,以便系統死機後能夠重新調用來恢復


案例1:實現一個家庭自動化遙控器,能遙控燈,空調,,,等設備的開/關。(硬件api類是廠家提供),類圖如下:
“Head First 設計模式“ :命令模式


更多需求思考?
● 如果需要撤銷命令,怎麼修改呢?
● 如果需要組合命令,比如(先打開燈,然後打開電視,然後打開熱水器,打開影響),這麼實現呢?
● 如命令需要跨jvm,跨機器執行,怎麼實現呢?
● 如果需要宕機後恢復數據,怎麼實現呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章