設計模式(六)—— 命令模式
阿新 • • 發佈:2018-12-12
一、含義
將“請求”封裝成物件,以便使用不同的請求、佇列或者日誌來引數化其他物件。命令模式也支援可撤銷的操作。
二、要點
1.命令模式可以讓發出請求的物件和執行請求的物件之間進行解耦。
2.發出命令的物件和執行命令的物件之間是通過命令物件進行溝通的,命令物件封裝了接收者的一個或一組動作。
3.呼叫者通過呼叫命令物件發出請求,會使接受者的動作被呼叫。
三、實戰分析命令模式
首先讓我們來看一下命令模式的類圖:
舉個例子說明一下:例如我現在有個控制器,可以控制電燈的開關。那麼首先我需要一個命令介面。
//命令介面 public interface Command { public void execute(); }
但是真正實現電燈開關的是電燈這個類,如果我要開啟電燈,那我就需要讓電燈去執行自己開啟電燈的操作,那我命令物件就需要呼叫電燈這個物件,程式碼例項如下:
//這是一個命令物件需要實現命令介面 public class LightOnCommand implements Command { //這個就是命令的真正執行者 Light light; public LightOnCommand(Light light) { this.light = light; } //execute方法呼叫接收物件,也就是燈泡物件的on方法 @Override public void execute() { light.on(); } }
然後還需要一個真正的命令執行者就是燈泡物件例項:
public class Light {
//開啟電燈的操作
public void on() {
System.out.println("Light is on");
}
}
遙控器就是命令物件的使用者,其程式碼如下:
//這就是命令的呼叫者 public class SimpleRemoteControl { //傳入一個命令物件的例項 Command slot; public SimpleRemoteControl(Command slot) { this.slot = slot; } //當遙控器按下燈泡開燈的按鈕時,就會呼叫命令物件的execute方法 public void ButtonLightOn() { slot.execute(); } }
最後我們來寫個程式碼,來測試一下,測試程式碼如下:
public class CommandTest {
public static void main(String[] args) {
//首先建立一個命令物件的執行者,電燈就是命令物件的執行者
Light light = new Light();
//然後就是命令物件本身,並將命令物件的執行者,傳遞進來
LightOnCommand lightOnCommand = new LightOnCommand(light);
//在建立一個命令物件的呼叫者,並將命令物件傳進來
SimpleRemoteControl remoteControl = new SimpleRemoteControl(lightOnCommand);
//最後按下開關,開啟電燈
remoteControl.ButtonLightOn();
}
}
最後程式碼的執行結果為:
Light is on