該模式出現是為了解決一些問題:解耦,以達到對修改封閉,對擴充套件開放的原則(開閉原則);命令組合實現功能。
將乙個請求封裝為乙個物件,從而使你可以用不同的請求對客戶進行引數化;對請求排隊或記錄請求日子,以及支援撤銷的操作。
建立乙個具體命令,並制定其接收者。(例子中的使用者)
所有命令的抽象介面,抽象執行方法。
持有命令角色,定義不同的請求方法,對應執行不同的命令。(例子中的鍵盤)
負責接收和具體執行命令。(錄音機)
/**
* 錄音機:接受者,執行具體的命令
* * created by rytong on 2017/10/25.
*/public class audioplayer
// 暫停
public void pause()
}
/**
* 抽象命令介面
* * created by rytong on 2017/10/25.
*/public inte***ce commadinte***ce
/**
* * created by rytong on 2017/10/25.
*/public class playcommand implements commadinte***ce
@override
public void excute()
}
/**
* 錄音機按鍵:請求者角色,持有具體命令
* * created by rytong on 2017/10/25.
*/public class audiokeyboard
public void setpausecommand(commadinte***ce pausecommand)
public void play()
//暫停
public void pause()
}
//客戶端
//建立乙個接受者
audioplayer audioplayer = new audioplayer();
//建立具體的命令,制定接受者
pausecommand pausecommand = new pausecommand(audioplayer);
playcommand playcommand = new playcommand(audioplayer);
//建立請求者
audiokeyboard audiokeyboard = new audiokeyboard();
audiokeyboard.setpausecommand(pausecommand);
audiokeyboard.setplaycommand(playcommand);
//請求者執行對應命令
audiokeyboard.play();
audiokeyboard.pause();
10-25 10:36:37.182 23772-23772/com.commandpattern e/audioplayer: 已經暫停
例子:執行緒的執行(省略了接收者,直接在具體命令中處理具體操作),簡單** 如下:
new thread(new runnable()
}).start();
更鬆散的耦合:呼叫者不需要哦知道內部具體做了什麼處理,只知道結果。
更動態的控制,可以把不同的命令組裝起來,動態執行(比如總共有20個命令,不同組合可以實現不同的效果,這樣會比較靈活)
擴充套件性好,只需要擴充套件新的命令,無需修改原有的邏輯。
如果系統比較龐大時,每個命令都需要編寫乙個新的類,這樣系統會看起來非常臃腫;
設計模式之命令設計模式
先來看一下命令模式的類圖 乍一看好像類很多,其實我們逐個分析他們。類圖中存在的類可以分為 invoker icommand conceretecommand receiver invoker類 上層直接調取invoker類 icommand 是對命令的抽象 conceretecommand 是命令的...
設計模式之命令模式
command pattern 將請求封裝成物件,這可以讓你使用不同的請求,佇列,或者是日誌請求來引數化其他物件,命令模式也可以支援撤銷操作。命令模式有兩種實現方式 1.在命令管理器中提供設定當前命令接受者的方法,當執行訊息或者是有訊息壓入的時候直接將命令傳送給當前設定的接受者。2.在命令管理器中建...
設計模式之命令模式
當我們有一台多功能的印表機,然後通過電腦直接進行任務,如圖 如果通過這樣的設計直接去呼叫多功能一體機的功能,就會存在此時此刻只能進行乙個任務,不允許有多個客戶端同時操作.那麼現在我們就需要考慮一種新的設計模式,叫做命令設計模式。命令設計模式 將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行...