命令模式(附代碼,實現(xiàn)撤銷與重做)_第1頁
命令模式(附代碼,實現(xiàn)撤銷與重做)_第2頁
命令模式(附代碼,實現(xiàn)撤銷與重做)_第3頁
命令模式(附代碼,實現(xiàn)撤銷與重做)_第4頁
命令模式(附代碼,實現(xiàn)撤銷與重做)_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、READY?Now LoadingCOAMMND命令模式命令模式粗識概述 結(jié)構(gòu)簡述模式細解模式詳解 實例解析實際應用效果&優(yōu)缺點&使用注意 相關(guān)模式 應用 命令模式粗識概述 結(jié)構(gòu)簡述楊虎剛 對于使用空調(diào)的 客戶 就是我們來說,開機確實很簡單,按下遙控按鈕 ,然后耐心等待就可以了。但是但是當按下啟動按鈕過后呢?誰來處理?如何處理?經(jīng)歷了怎樣的過程,才讓空調(diào)啟動起來?也就是說也就是說客戶只管發(fā)出命令,客戶只管發(fā)出命令,誰實現(xiàn)命令,如何實現(xiàn),誰實現(xiàn)命令,如何實現(xiàn),客戶是不關(guān)心的。客戶是不關(guān)心的。如何開空調(diào),空調(diào)最終是由空調(diào)哪個部件打開,客戶是不知道的。ClientClient: 創(chuàng)建

2、具體的命令對象,并且設置命令對象創(chuàng)建具體的命令對象,并且設置命令對象的接收者。注意這個的接收者。注意這個不是常規(guī)不是常規(guī)意義上的客戶端,意義上的客戶端,而是在組裝命令對象和而是在組裝命令對象和接收者。接收者。CommandCommand:定義命令的接口,聲明執(zhí)行的方法定義命令的接口,聲明執(zhí)行的方法。ConcreteCommandConcreteCommand:命令接口實現(xiàn)對象,是命令接口實現(xiàn)對象,是“虛虛”的的實現(xiàn)。實現(xiàn)。ReceiverReceiver:接收者,真正執(zhí)行命令的對象接收者,真正執(zhí)行命令的對象。InvokerInvoker: 要求命令對象執(zhí)行請求,通常會持有命要求命令對象執(zhí)行請求

3、,通常會持有命令對象,可以持有很多的命令對象令對象,可以持有很多的命令對象。2022-2-122022-2-12模式細解模式詳解 實例解析孫冉剛才講到的通用Command類圖Command public interface Command void Execute();打開空調(diào)Command public class 打開空調(diào)Command : Command 空調(diào) airCondition; public 打開空調(diào)Command(空調(diào) airCondition) this.airCondition = airCondition; public void Execute() /注意,你可以在E

4、xecute()中添加多個方法 airCondition.Start(); 關(guān)閉空調(diào)Command public class 關(guān)閉空調(diào)Command : Command 空調(diào) airCondition; public 關(guān)閉空調(diào)Command(空調(diào) airCondition) this.airCondition = airCondition; public void Execute() airCondition.Stop(); Invoker public class 遙控器 private Command onCommand; public void 執(zhí)行() onCommand.Execut

5、e(); public void SetCommand(Command onCommand) this.onCommand = onCommand; Receiver public class 空調(diào) /接受者 public void Start() Console.WriteLine(空調(diào)打開了); public void Stop() Console.WriteLine(空調(diào)關(guān)上了); Client static void Main(string args) string str = ; 空調(diào) airCondition = new 空調(diào)(); 遙控器 panel = new 遙控器(); C

6、ommand aironCommand = new 打開空調(diào)Command(airCondition); Command airoffCommand = new 關(guān)閉空調(diào)Command(airCondition); Console.WriteLine(1.開空調(diào) 2.關(guān)空調(diào) 3.退出); while (str != 3) str = Console.ReadLine(); if (str = 1) panel.SetCommand(aironCommand); panel.執(zhí)行(); if (str = 2) panel.SetCommand(airoffCommand); panel.執(zhí)行(

7、); Command public interface Command void Execute(); void undo(); 打開空調(diào)Command public class 打開空調(diào)Command : Command 空調(diào) airCondition; public 打開空調(diào)Command(空調(diào) airCondition) this.airCondition = airCondition; public void Execute() /注意,你可以在Execute()中添加多個方法 airCondition.Start(); public void undo() Console.Write

8、Line(撤銷 空調(diào)打開了); Invoker public class 遙控器 List undolist = new List(); List redolist = new List(); private Command onCommand; public void 執(zhí)行() onCommand.Execute(); undolist.Add(onCommand); public void SetCommand(Command onCommand) this.onCommand = onCommand; Invoker public void 撤銷() if (undolist.Count

9、 = 0) Console.WriteLine(已經(jīng)不能在撤銷了); else redolist.Add(undolistundolist.Count - 1); undolistundolist.Count - 1.undo(); undolist.Remove(undolistundolist.Count - 1); Invoker public void 恢復() if (redolist.Count = 0) Console.WriteLine(已經(jīng)不能在恢復了); else undolist.Add(redolistredolist.Count-1); redolistredolis

10、t.Count - 1.Execute(); redolist.Remove(redolistredolist.Count - 1); Client class Program static void Main(string args) ArrayList list1 = new ArrayList(); string str=; 空調(diào) 空調(diào) = new 空調(diào)(); 電視 電視 = new 電視(); 遙控器 遙控器 = new 遙控器(); Command 打開空調(diào) = new 打開空調(diào)Command(空調(diào)); Command 關(guān)上空調(diào) = new 關(guān)閉空調(diào)Command(空調(diào)); Comm

11、and 打開電視=new 打開電視Command(電視); Command 關(guān)上電視 = new 關(guān)閉電視Command(電視); Console.WriteLine(請輸入1、2、3、4、5、6、7、8:); Console.WriteLine(1代表打開電視*2代表關(guān)上電視*3代表打開空調(diào)); Console.WriteLine(4代表關(guān)上空調(diào)*5代表撤銷操作*6重做*7退出);Client while (str != 7) str = Console.ReadLine(); if (str = 1) list1.Add(a); 遙控器.SetCommand(打開電視); 遙控器.執(zhí)行()

12、 ; else if (str = 5) 遙控器.撤銷();else if (str = 6) 遙控器.恢復(); 實際應用效果&優(yōu)缺點 使用須知 應用 杜宗軒CallBack講的便是先將一個函數(shù)登記上,然后在以后調(diào)用此函數(shù)。因為使用此函數(shù)可以把調(diào)用者與被調(diào)用者分開,所以調(diào)用者不關(guān)心誰是被調(diào)用者。它只需知道存在一個具有特定原型和限制條件的被調(diào)用函數(shù)。簡而言之,回調(diào)函數(shù)就是允許用戶把需要調(diào)用的方法的指針作為參數(shù)傳遞給一個函數(shù),以便該函數(shù)在處理相似事件的時候可以靈活的使用不同的方法。Command模式將調(diào)用操作的對象與知道如何實現(xiàn)該操作的對象解耦。Command是頭等的對象。它們可以像其他

13、對象一樣被操縱和擴展你可以將多個命令裝配成一個復合命令。增加新的Command很容易,因為這無需改變已有的類。所謂命令模式的根本思想就是:所謂命令模式的根本思想就是: 先形成命令,在根據(jù)命令執(zhí)行。先形成命令,在根據(jù)命令執(zhí)行。理解思想,不要機械的照搬。消化成自己的理解思想,不要機械的照搬。消化成自己的 要支持要支持Undo和和Redo的話,需要一個表的話,需要一個表-對表的操作對表的操作 避免取消操作過程中的錯誤積累避免取消操作過程中的錯誤積累解耦了發(fā)送者和接受者之間聯(lián)系同時Command模式可控性不強,如果要為所有Service動態(tài)增加類似Filter等這樣通用功能,如權(quán)限檢查等是非常不方便的

14、。結(jié)構(gòu)復雜,代碼實現(xiàn)可能會不方便會導致某些系統(tǒng)有過多的具體命令類。可以很容易的記錄操作日志 和進行撤銷,重做操作能較容易地建立一個命令隊列;。 需求: 有個固定命令組合會多次被執(zhí)行 解決: 加入組成模式,定義一個宏命令類publicclassMacroCommandimplementsCommandprivateListcmdList=newArrayList();publicadd(Commandcommand)cmdList.add(command); publicremove(Commandcommand)cmdList.remove(command);publicvoidexecute

15、()Commandcmd;for(inti=0;icmdList.size();i+)cmd=(Command)cmdList.get(i);cmd.execute();使用時可以將MacroCommand當做普通命令使用。請求角色并不知道這是一個宏命令。需求:需要加入redo undo操作 解決:加入備忘錄模式 public class ConcreteCommandOne implements Command private Receiver receiver; private Receiver lastReceiver; public ConcreteCommandOne(Receive

16、r receiver) this.receiver = receiver; public void execute() record(); receiver.actionOne(); public void undo() /恢復狀態(tài) public void redo() lastReceiver.actionOne(); public record() /記錄狀態(tài) 面向過程設計和面向?qū)ο笤O計的一個區(qū)別就是:是否在業(yè)務邏輯層使用冗長的if else判斷。傳統(tǒng)思維習慣的分析面向過程分析,是順向向下的分析,像流下的水流。而在面向?qū)ο笤O計中,要求打破從上到下的順序過程,程序的執(zhí)行過程有OO決定,由事物

17、決定。用 Command 模式做切換這樣可以讓代碼沒那么多邏輯分支用Command命令控制到不同的操作分離判斷。為程序提供更清晰的層次結(jié)構(gòu)。命令模式的角色比較多,命令模式的角色比較多,在實際應用中可以根據(jù)所需要的在實際應用中可以根據(jù)所需要的功能和不需要的功能加以簡化。功能和不需要的功能加以簡化。1 1去掉去掉 調(diào)用者調(diào)用者產(chǎn)生命令集合后,我們可以直接在產(chǎn)生命令集合后,我們可以直接在clientclient中迭代執(zhí)行執(zhí)行操中迭代執(zhí)行執(zhí)行操作作2 2 變化變化 調(diào)用者調(diào)用者 成為成為 跟蹤者跟蹤者public class Invoker /public class Invoker /調(diào)用者調(diào)用者 List commands; /List commands; /已經(jīng)執(zhí)行完畢的命令集合已經(jīng)執(zhí)行完畢的命令集合 public void addCommand (Command command,int i)public void addCommand (Command command,int i) commands.add(i,command);commands.add(i,command); public void action(C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論