Java設(shè)計(jì)模式課件-命令模式_第1頁(yè)
Java設(shè)計(jì)模式課件-命令模式_第2頁(yè)
Java設(shè)計(jì)模式課件-命令模式_第3頁(yè)
Java設(shè)計(jì)模式課件-命令模式_第4頁(yè)
Java設(shè)計(jì)模式課件-命令模式_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

大綱

命令模式概述

命令模式的結(jié)構(gòu)與實(shí)現(xiàn)

命令模式的應(yīng)用實(shí)例

實(shí)現(xiàn)命令隊(duì)列

記錄請(qǐng)求日志

實(shí)現(xiàn)撤銷(xiāo)操作

宏命令

命令模式的優(yōu)缺點(diǎn)與適用環(huán)境很多軟件都能夠自定義快捷鍵命令模式概述

開(kāi)關(guān)與電燈、排氣扇示意圖命令模式概述

分析

現(xiàn)實(shí)生活?不同的電器來(lái)控制相同的開(kāi)關(guān)可以通過(guò)不同的電線?開(kāi)關(guān)請(qǐng)求發(fā)送者?電燈請(qǐng)求的最終接收者和處理者?開(kāi)關(guān)和電燈之間并不存在直接耦合關(guān)系,它們通過(guò)電線連接在一起,使用不同的電線可以連接不同的請(qǐng)求接收者命令模式概述

分析

軟件開(kāi)發(fā)?按鈕請(qǐng)求發(fā)送者?事件處理類(lèi)請(qǐng)求的最終接收者和處理者?發(fā)送者與接收者之間引入了新的命令對(duì)象(類(lèi)似電將發(fā)送者的請(qǐng)求封裝在命令對(duì)象中,再通過(guò)線),命令對(duì)象來(lái)調(diào)用接收者的方法?相同的按鈕可以對(duì)應(yīng)不同的事件處理類(lèi)命令模式概述

動(dòng)機(jī)

將請(qǐng)求發(fā)送者和接收者完全解耦

發(fā)送者與接收者之間沒(méi)有直接引用關(guān)系

發(fā)送請(qǐng)求的對(duì)象只需要知道如何發(fā)送請(qǐng)求,而不必知道如何完成請(qǐng)求命令模式命令模式概述

命令模式的定義命令模式:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而讓你可以用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化對(duì)請(qǐng)求排隊(duì),或者記錄請(qǐng)求日志,以及支持可撤銷(xiāo)的操作。CommandPattern:Encapsulatearequestasanobject,therebylettingyouparameterizeclientswithdifferentrequests,queueorlogrequests,andsupportundoableoperations.

對(duì)象行為型模式命令模式概述

命令模式的定義

別名為動(dòng)作(Action)模式或事務(wù)(Transaction)模式

“用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化”

“對(duì)請(qǐng)求排隊(duì)”

“記錄請(qǐng)求日志”

“支持可撤銷(xiāo)操作”-command:Command命令模式的本質(zhì)是對(duì)請(qǐng)求進(jìn)行封裝可以比較容易地設(shè)計(jì)一個(gè)命令隊(duì)列或(4)HelpCommand:幫助命令類(lèi),充當(dāng)具體命令類(lèi)ExitCommand</className>execute();}FunctionButton+execute()(4)HelpCommand:幫助命令類(lèi),充當(dāng)具體命令類(lèi)//public維持一個(gè)實(shí)現(xiàn)命令隊(duì)列classCommandQueue{CommandQueue對(duì)象的引用//publicvoidexecute(){調(diào)用CommandQueue類(lèi)的execute()方法//publicvoidexecute(){調(diào)用CommandQueue類(lèi)的execute()方法HelpCommandcommandQueue.//privateArrayList<Command>commands=newArrayList<Command>();構(gòu)造注入實(shí)現(xiàn)命令模式的結(jié)構(gòu)與實(shí)現(xiàn)

命令模式的結(jié)構(gòu)InvokerCommand+execute()ClientReceiverreceiverConcreteCommand-state+execute():+action()receiver.action();命令模式的結(jié)構(gòu)與實(shí)現(xiàn)

命令模式的結(jié)構(gòu)

命令模式包含以下4個(gè)角色:?Command?ConcreteCommand?Invoker(調(diào)用者)?Receiver(接收者)(抽象命令類(lèi))(具體命令類(lèi))命令模式的結(jié)構(gòu)與實(shí)現(xiàn)

命令模式的實(shí)現(xiàn)

命令模式的本質(zhì)是對(duì)請(qǐng)求進(jìn)行封裝

一個(gè)請(qǐng)求對(duì)應(yīng)于一個(gè)命令,將發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分開(kāi)

命令模式允許請(qǐng)求的一方和接收的一方獨(dú)立開(kāi)來(lái),使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口,更不必知道請(qǐng)求如何被接收、操作是否被執(zhí)行、何時(shí)被執(zhí)行,以及是怎么被執(zhí)行的命令模式的結(jié)構(gòu)與實(shí)現(xiàn)

命令模式的實(shí)現(xiàn)

典型的抽象命令類(lèi)代碼:publicabstractclassCommand{publicabstractvoidexecute();}publicclassInvoker{命令模式的結(jié)構(gòu)與實(shí)現(xiàn)privateCmand;

命令模式的實(shí)現(xiàn)//構(gòu)造注入publicInvoker(Cmand){

mand=command;典型的調(diào)用者(請(qǐng)求發(fā)送者)類(lèi)代碼:}//設(shè)值注入publicvoidsetCommand(Cmand){mand=command;}//業(yè)務(wù)方法,用于調(diào)用命令類(lèi)的execute()方法publicvoidcall(){command.execute();}}命令模式的結(jié)構(gòu)與實(shí)現(xiàn)

命令模式的實(shí)現(xiàn)

典型的具體命令類(lèi)代碼:publicclassConcreteCommandextendsCommand{privateReceiverreceiver;//維持一個(gè)對(duì)請(qǐng)求接收者對(duì)象的引用publicvoidexecute(){receiver.action();//調(diào)用請(qǐng)求接收者的業(yè)務(wù)處理方法action()}}命令模式的結(jié)構(gòu)與實(shí)現(xiàn)

命令模式的實(shí)現(xiàn)

典型的請(qǐng)求接收者類(lèi)代碼:publicclassReceiver{publicvoidaction(){//具體操作}}命令模式的應(yīng)用實(shí)例

實(shí)例說(shuō)明為了用戶(hù)使用方便,某系統(tǒng)提供了一系列功能鍵,用戶(hù)可以自定義功能鍵的功能,例如功能鍵FunctionButton可以用于退出系統(tǒng)(由SystemExitClass類(lèi)來(lái)實(shí)現(xiàn)),也可以用于顯示幫助文檔(由DisplayHelpClass類(lèi)來(lái)實(shí)現(xiàn))。用戶(hù)可以通過(guò)修改配置文件來(lái)改變功能鍵的用途,現(xiàn)使用命令模式來(lái)設(shè)計(jì)該系統(tǒng),使得功能鍵類(lèi)與功能類(lèi)之間解耦,可為同一個(gè)功能鍵設(shè)置不同的功能。命令模式的應(yīng)用實(shí)例

實(shí)例類(lèi)圖FunctionButtonCommand-command:Command++setCommand(Cmand)click():void:void+execute():voidSystemExitClassExitCommandHelpCommandDisplayHelpClass-seObj:SystemExitClass+execute():void-hcObj:DisplayHelpClass+execute():void+exit():void+display():voidseObj.exit();hcObj.display();功能鍵設(shè)置結(jié)構(gòu)圖命令模式的應(yīng)用實(shí)例

實(shí)例代碼

(1)FunctionButton:功能鍵類(lèi),充當(dāng)請(qǐng)求調(diào)用者(請(qǐng)求發(fā)送者)

(2)Command:抽象命令類(lèi)

(3)ExitCommand:退出命令類(lèi),充當(dāng)具體命令類(lèi)

(4)HelpCommand:幫助命令類(lèi),充當(dāng)具體命令類(lèi)

(5)SystemExitClass:退出系統(tǒng)模擬實(shí)現(xiàn)類(lèi),充當(dāng)請(qǐng)求接收者

(6)DisplayHelpClass:顯示幫助文檔模擬實(shí)現(xiàn)類(lèi),充當(dāng)請(qǐng)求接收者

(7)Client:客戶(hù)端測(cè)試類(lèi)演示……Code(mand)命令模式的應(yīng)用實(shí)例

結(jié)果及分析

如果需要更換具體命令類(lèi),無(wú)須修改源代碼,只需修改配置文件,完全符合開(kāi)閉原則

每一個(gè)具體命令類(lèi)對(duì)應(yīng)一個(gè)請(qǐng)求的處理者(接收者),通過(guò)向請(qǐng)求發(fā)送者注入不同的具體命令對(duì)象可以使相同的發(fā)送者對(duì)應(yīng)不同的接收者,從而實(shí)現(xiàn)“將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化”,客戶(hù)端只需要將具體命令對(duì)象作為參數(shù)注入請(qǐng)求發(fā)送者,無(wú)須直接操作請(qǐng)求的接收者<?xmlversion="1.0"?><config><className>mand.ExitCommand</className></config>實(shí)現(xiàn)命令隊(duì)列

動(dòng)機(jī)

當(dāng)一個(gè)請(qǐng)求發(fā)送者發(fā)送一個(gè)請(qǐng)求時(shí),有不止一個(gè)請(qǐng)求接收者產(chǎn)生響應(yīng),這些請(qǐng)求接收者將逐個(gè)執(zhí)行業(yè)務(wù)方法,完成對(duì)請(qǐng)求的處理

增加一個(gè)CommandQueue類(lèi),由該類(lèi)負(fù)責(zé)存儲(chǔ)多個(gè)命令對(duì)象,而不同的命令對(duì)象可以對(duì)應(yīng)不同的請(qǐng)求接收者

批處理importjava.util.*;publicclassInvoker{//public維持一個(gè)實(shí)現(xiàn)命令隊(duì)列classCommandQueue{CommandQueue對(duì)象的引用privateCommandQmandQueue;//定義一個(gè)ArrayList來(lái)存儲(chǔ)命令隊(duì)列//

privateArrayList<Command>commands=newArrayList<Command>();構(gòu)造注入實(shí)現(xiàn)publicInvoker(CommandQmandQueue){publicvoidaddCommand(Cmand){mandQueue=commandQueue;commands.add(command);}}//publicvoidremoveCommand(Cmand){設(shè)值注入publicvoidsetCommandQueue(CommandQmandQueue){commands.remove(command);mandQueue=commandQueue;}}//循環(huán)調(diào)用每一個(gè)命令對(duì)象的execute()方法//publicvoidexecute(){調(diào)用CommandQueue類(lèi)的execute()方法publicvoidcall(){for(Omand:commands){commandQueue.execute();((Command)command).execute();}}}}}記錄請(qǐng)求日志

動(dòng)機(jī)

將請(qǐng)求的歷史記錄保存下來(lái),通常以日志文件(LogFile)的形式永久存儲(chǔ)在計(jì)算機(jī)中?恢復(fù)機(jī)制為系統(tǒng)提供一種?可以用于實(shí)現(xiàn)批處理?防止因?yàn)閿嚯娀蛘呦到y(tǒng)重啟等原因造成請(qǐng)求丟失,而且可以避免重新發(fā)送全部請(qǐng)求時(shí)造成某些命令的重復(fù)執(zhí)行記錄請(qǐng)求日志

實(shí)現(xiàn)

將發(fā)送請(qǐng)求的命令對(duì)象通過(guò)序列化寫(xiě)到日志文件中

命令類(lèi)必須實(shí)現(xiàn)接口Serializable序列化命令對(duì)象日志文件實(shí)現(xiàn)撤銷(xiāo)操作

實(shí)例

可以通過(guò)對(duì)命令類(lèi)進(jìn)行修改使得系統(tǒng)支持撤銷(xiāo)(Undo)操作和恢復(fù)(Redo)操作設(shè)計(jì)一個(gè)簡(jiǎn)易計(jì)算器,該計(jì)算器可以實(shí)現(xiàn)簡(jiǎn)單的數(shù)學(xué)運(yùn)算,還可以對(duì)運(yùn)算實(shí)施撤銷(xiāo)操作。實(shí)現(xiàn)撤銷(xiāo)操作

結(jié)構(gòu)CalculatorFormAbstractCommand-command:AbstractCommand+setCommand(AbstractCmand):void+compute(intvalue)+undo(){abstract}:void:void+execute(intvalue):int+undo():intAddCommandAdder-adder:Adder-value:int+execute(intvalue):int+undo()-num+add(intvalue):int:int=0:int簡(jiǎn)易計(jì)算器結(jié)構(gòu)圖實(shí)現(xiàn)撤銷(xiāo)操作

實(shí)現(xiàn)

加法類(lèi):Adder(請(qǐng)求接收者)

抽象命令類(lèi):AbstractCommand

加法命令類(lèi):AddCommand(具體命令類(lèi))

計(jì)算器界面類(lèi):CalculatorForm(請(qǐng)求發(fā)送者)

客戶(hù)端測(cè)試類(lèi):Client演示……Code(mand.calculator)宏命令

動(dòng)機(jī)

宏命令(MacroCommand)又稱(chēng)為組合命令(CompositeCommand),它是組合模式和命令模式聯(lián)用的產(chǎn)物

宏命令是一個(gè)具體命令類(lèi),它擁有一個(gè)集合,在該集合中包含了對(duì)其他命令對(duì)象的引用

當(dāng)調(diào)用宏命令的execute()方法時(shí),將遞歸調(diào)用它所包含的每個(gè)成員命令的execute()方法。一個(gè)宏命令的成員可以是簡(jiǎn)單命令,還可以繼續(xù)是宏命令

執(zhí)行一個(gè)宏命令將觸發(fā)多個(gè)具體命令的執(zhí)行,從而實(shí)現(xiàn)對(duì)命令的批處理宏命令

結(jié)構(gòu)CommandInvoker+addCommand(Cmand)+removeCommand(Cmand)+getCommand(inti)+execute()*1ConcreteCommandAConcreteCommandBMacroCommand-commands:ArrayList<Command>+addCommand(Cmand)+removeCommand(Cmand)+getCommand(inti)+execute()+execute()+execute()ReceiverAReceiverBfor(Omand:commands){((Object)command).execute();}+action()+action()命令模式的優(yōu)缺點(diǎn)與適用環(huán)境

模式優(yōu)點(diǎn)

降低系統(tǒng)的耦合度

新的命令可以很容易地加入到系統(tǒng)中,符合開(kāi)閉原則

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論