




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、READY?Now LoadingCOAMMND命令模式命令模式粗識(shí)概述 結(jié)構(gòu)簡述模式細(xì)解模式詳解 實(shí)例解析實(shí)際應(yīng)用效果&優(yōu)缺點(diǎn)&使用注意 相關(guān)模式 應(yīng)用 命令模式粗識(shí)概述 結(jié)構(gòu)簡述楊虎剛 對(duì)于使用空調(diào)的 客戶 就是我們來說,開機(jī)確實(shí)很簡單,按下遙控按鈕 ,然后耐心等待就可以了。但是但是當(dāng)按下啟動(dòng)按鈕過后呢?誰來處理?如何處理?經(jīng)歷了怎樣的過程,才讓空調(diào)啟動(dòng)起來?也就是說也就是說客戶只管發(fā)出命令,客戶只管發(fā)出命令,誰實(shí)現(xiàn)命令,如何實(shí)現(xiàn),誰實(shí)現(xiàn)命令,如何實(shí)現(xiàn),客戶是不關(guān)心的。客戶是不關(guān)心的。如何開空調(diào),空調(diào)最終是由空調(diào)哪個(gè)部件打開,客戶是不知道的。ClientClient: 創(chuàng)建
2、具體的命令對(duì)象,并且設(shè)置命令對(duì)象創(chuàng)建具體的命令對(duì)象,并且設(shè)置命令對(duì)象的接收者。注意這個(gè)的接收者。注意這個(gè)不是常規(guī)不是常規(guī)意義上的客戶端,意義上的客戶端,而是在組裝命令對(duì)象和而是在組裝命令對(duì)象和接收者。接收者。CommandCommand:定義命令的接口,聲明執(zhí)行的方法定義命令的接口,聲明執(zhí)行的方法。ConcreteCommandConcreteCommand:命令接口實(shí)現(xiàn)對(duì)象,是命令接口實(shí)現(xiàn)對(duì)象,是“虛虛”的的實(shí)現(xiàn)。實(shí)現(xiàn)。ReceiverReceiver:接收者,真正執(zhí)行命令的對(duì)象接收者,真正執(zhí)行命令的對(duì)象。InvokerInvoker: 要求命令對(duì)象執(zhí)行請(qǐng)求,通常會(huì)持有命要求命令對(duì)象執(zhí)行請(qǐng)求
3、,通常會(huì)持有命令對(duì)象,可以持有很多的命令對(duì)象令對(duì)象,可以持有很多的命令對(duì)象。2022-2-122022-2-12模式細(xì)解模式詳解 實(shí)例解析孫冉剛才講到的通用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()中添加多個(gè)方法 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()中添加多個(gè)方法 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 恢復(fù)() if (redolist.Count = 0) Console.WriteLine(已經(jīng)不能在恢復(fù)了); 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(請(qǐng)輸入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) 遙控器.恢復(fù)(); 實(shí)際應(yīng)用效果&優(yōu)缺點(diǎn) 使用須知 應(yīng)用 杜宗軒CallBack講的便是先將一個(gè)函數(shù)登記上,然后在以后調(diào)用此函數(shù)。因?yàn)槭褂么撕瘮?shù)可以把調(diào)用者與被調(diào)用者分開,所以調(diào)用者不關(guān)心誰是被調(diào)用者。它只需知道存在一個(gè)具有特定原型和限制條件的被調(diào)用函數(shù)。簡而言之,回調(diào)函數(shù)就是允許用戶把需要調(diào)用的方法的指針作為參數(shù)傳遞給一個(gè)函數(shù),以便該函數(shù)在處理相似事件的時(shí)候可以靈活的使用不同的方法。Command模式將調(diào)用操作的對(duì)象與知道如何實(shí)現(xiàn)該操作的對(duì)象解耦。Command是頭等的對(duì)象。它們可以像其他
13、對(duì)象一樣被操縱和擴(kuò)展你可以將多個(gè)命令裝配成一個(gè)復(fù)合命令。增加新的Command很容易,因?yàn)檫@無需改變已有的類。所謂命令模式的根本思想就是:所謂命令模式的根本思想就是: 先形成命令,在根據(jù)命令執(zhí)行。先形成命令,在根據(jù)命令執(zhí)行。理解思想,不要機(jī)械的照搬。消化成自己的理解思想,不要機(jī)械的照搬。消化成自己的 要支持要支持Undo和和Redo的話,需要一個(gè)表的話,需要一個(gè)表-對(duì)表的操作對(duì)表的操作 避免取消操作過程中的錯(cuò)誤積累避免取消操作過程中的錯(cuò)誤積累解耦了發(fā)送者和接受者之間聯(lián)系同時(shí)Command模式可控性不強(qiáng),如果要為所有Service動(dòng)態(tài)增加類似Filter等這樣通用功能,如權(quán)限檢查等是非常不方便的
14、。結(jié)構(gòu)復(fù)雜,代碼實(shí)現(xiàn)可能會(huì)不方便會(huì)導(dǎo)致某些系統(tǒng)有過多的具體命令類??梢院苋菀椎挠涗洸僮魅罩?和進(jìn)行撤銷,重做操作能較容易地建立一個(gè)命令隊(duì)列;。 需求: 有個(gè)固定命令組合會(huì)多次被執(zhí)行 解決: 加入組成模式,定義一個(gè)宏命令類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();使用時(shí)可以將MacroCommand當(dāng)做普通命令使用。請(qǐng)求角色并不知道這是一個(gè)宏命令。需求:需要加入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() /恢復(fù)狀態(tài) public void redo() lastReceiver.actionOne(); public record() /記錄狀態(tài) 面向過程設(shè)計(jì)和面向?qū)ο笤O(shè)計(jì)的一個(gè)區(qū)別就是:是否在業(yè)務(wù)邏輯層使用冗長的if else判斷。傳統(tǒng)思維習(xí)慣的分析面向過程分析,是順向向下的分析,像流下的水流。而在面向?qū)ο笤O(shè)計(jì)中,要求打破從上到下的順序過程,程序的執(zhí)行過程有OO決定,由事物
17、決定。用 Command 模式做切換這樣可以讓代碼沒那么多邏輯分支用Command命令控制到不同的操作分離判斷。為程序提供更清晰的層次結(jié)構(gòu)。命令模式的角色比較多,命令模式的角色比較多,在實(shí)際應(yīng)用中可以根據(jù)所需要的在實(shí)際應(yīng)用中可以根據(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作中合同協(xié)議書
- 美容消費(fèi)服務(wù)合同協(xié)議書
- 數(shù)產(chǎn)品方案策劃書3
- 電鍍氧化加工合同協(xié)議書
- 一種適老智能家居全場(chǎng)景方案規(guī)劃
- 中國乙二醇乙醚項(xiàng)目創(chuàng)業(yè)投資方案
- 非洲豬瘟與常見豬病的癥狀鑒別
- 原材料投資合同協(xié)議書
- 旅游管理-旅行社品牌策略
- 全國項(xiàng)目拓展計(jì)劃書模板
- 河南省青桐鳴大聯(lián)考普通高中2024-2025學(xué)年高三考前適應(yīng)性考試地理試題及答案
- 《溺水急救方法》課件
- 辦公樓安全培訓(xùn)
- 家庭教育方式綜合測(cè)驗(yàn)
- 律師會(huì)見筆錄范本
- 浙教版科學(xué)電學(xué)基礎(chǔ)知識(shí)總結(jié)
- T/CEC 164-2018 火力發(fā)電廠智能化技術(shù)導(dǎo)則_(高清-最新版)
- 抹機(jī)水MSDS 安全資料表
- 醫(yī)院感染管理組織框架
- 特殊平行四邊形課件
- 八種皮膚類型PPT課件
評(píng)論
0/150
提交評(píng)論