命令模式——HeadFirst设计模式学习笔记
命令模式:將“請求”封裝成對象,以便使用不同的請求、日志、隊列等來參數化其他對象。命令模式也支持撤銷操作。
?
設計原則:
- 把方法的調用封裝起來,調用此對象不需要知道它內部具體是如何運行的,只需要知道包裝成型的方法
- 命令模式的本質是對命令進行封裝,將發出命令的責任和執行命令的責任分割開
- 將“動作請求者”從“動作執行者”中解耦,即將發出請求的對象和接受并執行請求的對象分離開來。兩者通過命令對象溝通
- 命令模式的關鍵在于引入了抽象命令接口,且發送者針對抽象命令接口編程,只有實現了抽象命令接口的具體命令才能與接收者相關聯
?
特點:
- 對象只知道通過接口暴露出execute()方法,當此方法調用時,接受者執行具體的動作。對象不知道那個接受者執行了什么動作,只知道操作進行了
?
NoCommand對象:execute()方法為空的對象,即不執行任何操作的對象。客戶端處理null操作時交給空對象,而無需做if(command != null)操作。
?
撤銷操作:在管理一組操作對象的對象中可以添加一個上一個操作的對象引用,用于追蹤最后調用的命令,并通過命令的undo()方法實現撤銷。同樣在操作命令對象中也可添加局部變量記錄上一個狀態以實現undo()方法。
可使用堆棧記錄操作過程中的每一個命令,實現多次撤銷
?
宏命令:同時執行多個命令,軟編碼,傳入命令數組,動態決定哪些命令
?
日志請求:使用命令模式的記錄日志,我們可以將上個檢查點之后的操作都記錄下來,如果系統出現問題,從檢查點開始執行命令
隊列請求:把一組命令放到隊列(先進先出)中,線程從隊列中一個一個刪除命令,然后調用它的excecute()方法。
?
?
類圖:
Command:定義命令的接口,聲明執行的方法。 ConcreteCommand:命令接口實現對象,通常會持有接收者,并調用接收者的功能來完成命令要執行的操作。(組合方式) Receiver:接收者,真正執行命令的對象。任何類都可能成為一個接收者,只要它能夠實現命令要求實現的相應功能。 Invoker:要求命令對象執行請求,通常會持有命令對象,可以持有很多的命令對象。 Client:創建具體的命令對象,并且設置命令對象的接收者。真正使用命令的客戶端是從Invoker來觸發執行。
?
舉例:
使用命令模式實現遙控器,遙控器上的不同按鈕控制電燈的開關及亮度、天花板風扇的開關及轉速等,支持撤銷
1、命令接口:Command
1 public interface Command { 2 public void execute(); 3 }2、對Receiver(燈)實現開關命令
1 public class LightOnCommand implements Command { 2 Light light; 3 public LightOnCommand(Light light) { 4 this.light = light; 5 } 6 public void execute() { 7 light.on(); 8 } 9 } 10 11 public class LightOffCommand implements Command { 12 Light light; 13 public LightOffCommand(Light light) { 14 this.light = light; 15 } 16 public void execute() { 17 light.off(); 18 } 19 }3、實現Invoker控制
1 public class SimpleRemoteControl { 2 Command slot; 3 public SimpleRemoteControl() {} 4 public void setCommand(Command command) { 5 slot = command; 6 } 7 public void buttonWasPressed() { 8 slot.execute(); 9 } 10 }4、Client使用Invoker控制器
1 public class RemoteControlTest { 2 public static void main(String[] args) { 3 SimpleRemoteControl remote = new SimpleRemoteControl(); 4 Light light = new Light(); 5 LightOnCommand lightOn = new LightOnCommand(light); 6 remote.setCommand(lightOn); 7 remote.buttonWasPressed(); 8 } 9 }?
轉載于:https://www.cnblogs.com/HectorHou/p/5995049.html
總結
以上是生活随笔為你收集整理的命令模式——HeadFirst设计模式学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二章 spring
- 下一篇: 安卓高级6 拍照或者从相册获取图片 并检