設計模式筆記之十命令模式
阿新 • • 發佈:2018-12-20
命令模式
為什麼引用命令模式
當需求變動比較頻繁,如果沒有一個具體的負責人的話,那我們每次都必須將專案相關人員帶上,去和客戶討論需求,這樣做的結果是人力成本過高,而且過去麻煩,如果可以有個負責人,負責只需接受客戶的命令需求,就立刻通知相關負責部門進行執行就可以方便很多了,這就是為什麼引入命令模式。
命令模式是什麼
將一個請求封裝為一個物件,從而可用不同的請求對客戶進行引數化,對請求排隊或者記錄請求日誌,以及支援可撤銷的操作。
核心思想
Command:命令介面,提供所有命令實現類必須實現的方法。
ConcreteCommand:具體命令,包含Receiver物件,通過Execution方法,呼叫Receiver的Action方法。
Invoker:呼叫者,包含一個command物件,可以執行command的execute()方法
Receiver:接受者,定義了接受者該做的操作,不同的具體接受者可以實現不同的操作。
具體案例
按鈕點選,接受到點選不同的按鈕,實現不同的功能,使用命令模式實現。
UML:
程式碼
package com.dong.Command; public interface Button { public void Execute(); } package com.dong.Command; public class CloseButtonReceiver { public void Do() { System.out.println("Close the machine"); } } package com.dong.Command; public class OpenButtonReceiver { public void Do() { System.out.println("Start the machine "); } } package com.dong.Command; public class BlueButton implements Button { private CloseButtonReceiver receiver; public BlueButton(CloseButtonReceiver receiver) { this.receiver = receiver; } @Override public void Execute() { // TODO Auto-generated method stub receiver.Do(); } } package com.dong.Command; public class RedButton implements Button { public OpenButtonReceiver receiver ; public RedButton(OpenButtonReceiver receiver) { this.receiver = receiver; } @Override public void Execute() { receiver.Do(); } } package com.dong.Command; public class Invoker { private Button button; public void setButton(Button button) { this.button = button; } public void action() { this.button.Execute(); } } package com.dong.Command; /** * 執行結果: * Start the machine * Close the machine * @author liuD * */ public class client { public static void main(String[] args) { //負責人,負責接收命令,分配任務,讓具體的執行者執行 Invoker invoker = new Invoker(); //不同的接受者,即執行命令的主體,可以由多個接受者,每個接受的執行方式不同 OpenButtonReceiver receiver =new OpenButtonReceiver(); //將命令傳遞給特定的接受者 Button redbutton = new RedButton(receiver); //負責人將命名分配給特定的負責人 invoker.setButton(redbutton); //負責人讓具體接受人開始幹活,具體的接受者開始執行相應的操作。 invoker.action(); CloseButtonReceiver creceiver = new CloseButtonReceiver(); Button bluebutton = new BlueButton(creceiver); invoker.setButton(bluebutton); invoker.action(); } }
優點
命令的接受者和執行者實現分離,解耦,
一個命令可以對應多個接受者,每個接受者可以執行不同的操作,擴充套件容易。
缺點
如果命令過多,則子類就需要更多。