Android 設計模式 - 命令模式
命令模式:將一個請求封裝為一個物件,從而使我們可以用不同的請求對客戶進行引數化;對請求排隊或者記錄請求日誌,以及支援可撤銷的操作。
命令模式包含如下角色:
-
Command: 抽象命令類
宣告用於執行請求的 execute 等方法,通過這些方法可以呼叫接收者的相關操作
-
ConcreteCommand: 具體命令類
實現在抽象命令類中宣告的方法,它對應具體的接收者物件,將接收者的動作繫結其中。
-
Invoker: 呼叫者
呼叫者即請求的傳送者,又稱為請求者,它通過命令物件來執行請求。
-
Receiver: 接收者
接收者執行與請求相關的操作,它具體實現對請求的業務處理。
-
Client: 客戶類
舉個例子:遙控器控制電視的開關,我們把開和關的命令封裝起來。遙控器只知道開關的命令,電視機只會響應開關,這樣就做到了解耦。

類圖
/** * @author Richie on 2018.03.15 * 電視機控制命令,抽象命令角色 */ public interface ICommand { /** * 執行命令 */ void execute(); } /** * @author Richie on 2018.03.15 * 電視機,接收者角色 */ public class Television { public void turnOn(){ System.out.println("Turn on television"); } public void turnOff(){ System.out.println("Turn off television"); } } /** * @author Richie on 2018.03.15 * 開啟命令,具體命令角色 */ public class TurnOnCommand implements ICommand { private Television television; public TurnOnCommand(Television television) { this.television = television; } @Override public void execute() { television.turnOn(); } } /** * @author Richie on 2018.03.15 * 關閉命令,具體命令角色 */ public class TurnOffCommand implements ICommand { private Television television; public TurnOffCommand(Television television){ this.television = television; } @Override public void execute() { television.turnOff(); } } /** * @author Richie on 2018.03.15 * 遙控器,呼叫者角色 */ public class RemoteControl { private ICommand command; public RemoteControl(ICommand command){ this.command = command; } public void setCommand(ICommand command) { this.command = command; } public void turnOnTv(){ command.execute(); } public void turnOffTv(){ command.execute(); } } public static void main(String[] args){ Television television = new Television(); TurnOnCommand turnOnCommand = new TurnOnCommand(television); RemoteControl remoteControl = new RemoteControl(turnOnCommand); remoteControl.turnOnTv(); TurnOffCommand turnOffCommand = new TurnOffCommand(television); remoteControl.setCommand(turnOffCommand); remoteControl.turnOffTv(); }
命令模式的本質是對命令進行封裝,將發出命令的責任和執行命令的責任分開。命令模式使請求本身成為一個物件,這個物件和其他物件一樣可以被儲存和傳遞。
優點:在於降低系統的耦合度,增加新的命令很方便,而且可以比較容易地設計一個命令佇列和巨集命令,並方便地實現對請求的撤銷和恢復。
缺點:在於可能會導致某些系統有過多的具體命令類。
使用場景:需要將請求呼叫者和接收者解耦,使得呼叫者和接收者不直接互動;需要在不同的時間指定請求、將請求排隊和執行請求;需要支援命令的撤銷操作和恢復操作,需要將一組操作組合在一起,即支援巨集命令。
【附錄】

資料圖
需要資料的朋友可以加入Android架構交流QQ群聊:513088520
點選連結加入群聊【Android移動架構總群】: 加入群聊
獲取免費學習視訊,學習大綱另外還有像高階UI、效能優化、架構師課程、NDK、混合式開發(ReactNative+Weex)等Android高階開發資料免費分享。