日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

命令模式——HeadFirst设计模式学习笔记

發布時間:2025/3/21 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 命令模式——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设计模式学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。