




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、headfirst設(shè)計(jì)模式讀書(shū)總結(jié)命令模式在本章,我們將把封裝帶到一個(gè)全新的境界:把方法調(diào)用(method invocation封裝起來(lái)。通過(guò)封裝發(fā)發(fā)調(diào)用,我們可以把運(yùn)算塊包裝成形。所以調(diào)用此運(yùn)算的對(duì)象不需要關(guān)心事情是如何進(jìn)行的。只要知道如何使用包裝成形的方法來(lái)完成它就可以。通過(guò)封裝方法調(diào)用,也可以做一些很聰明的事情,例如記錄日志,或者重復(fù)使用這些封裝來(lái)實(shí)現(xiàn)撤銷(xiāo)(undo。題例:家電自動(dòng)化設(shè)計(jì)一個(gè)家電自動(dòng)化遙控器的API。這個(gè)遙控器具有七個(gè)可編程的插槽,每個(gè)插槽都有對(duì)應(yīng)的開(kāi)關(guān)按鈕,這個(gè)遙控器還具備一個(gè)整體的撤銷(xiāo)按鈕。希望你能夠創(chuàng)建一組控制遙控器的API,讓每個(gè)插槽都能夠控制一個(gè)或一組裝置,能夠
2、控制目前的裝置和任何未來(lái)可能出現(xiàn)的裝置,這一點(diǎn)很重要。(這里有一組Java類(lèi),這些類(lèi)時(shí)由多個(gè)廠商開(kāi)發(fā)出來(lái)的,用來(lái)控制家電自動(dòng)化裝置,例如點(diǎn)燈,風(fēng)扇,熱水器,音響設(shè)備和其他類(lèi)似的可控制裝置。上面是很多的廠商類(lèi),看不清不要緊。你只要知道它很多,控制各種電器。有許多類(lèi)都具備on(和off(方法,除外還有其他的一些方法。遙控器應(yīng)該知道如何解讀按鈕被按下的動(dòng)作,然后發(fā)出正確的請(qǐng)求,但是遙控器不需要知道這些家電自動(dòng)化的細(xì)節(jié),或者如何打開(kāi)熱水器。提示:命令模式可將“動(dòng)作的請(qǐng)求者”從“動(dòng)作的執(zhí)行者”對(duì)象中解耦,在我們的題例中,請(qǐng)求者是遙控器,而執(zhí)行者對(duì)象就是廠商類(lèi)。利用命令對(duì)象,把請(qǐng)求(打開(kāi)點(diǎn)燈封裝成一個(gè)特定
3、對(duì)象(客廳點(diǎn)燈對(duì)象,如果對(duì)每個(gè)按鈕都存一個(gè)命令對(duì)象,那么當(dāng)按鈕被按下的時(shí)候,就可以請(qǐng)命令對(duì)象做相關(guān)的工作,遙控器并不需要知道工作內(nèi)容是什么,只要有個(gè)命令對(duì)象能和正確的對(duì)象溝通,把事情做好久可以了。命令模式的簡(jiǎn)單介紹(如果你已經(jīng)理解命令模式可以不看下面的例子餐廳解析:研究顧客,女招待,訂單,以及快餐廚師之間的交互。1:你,也就是顧客,把訂單交個(gè)女招待。2:女招待拿了訂單放在訂單柜臺(tái),然后喊了一聲“訂單來(lái)了”。3:快餐廚師根據(jù)訂單準(zhǔn)備餐點(diǎn)。讓我們更詳細(xì)地研究這個(gè)交互顧客知道自己要吃什么,并創(chuàng)建了一張訂單createOrder(,訂單包含一個(gè)訂單表格,顧客訂購(gòu)的餐點(diǎn)項(xiàng)目寫(xiě)在上面。女招待拿走了訂單te
4、keOrder(,放在訂單柜臺(tái),然后調(diào)用orderUp(方法,通知廚師準(zhǔn)備餐點(diǎn)。訂單上有所有準(zhǔn)備餐點(diǎn)是只是,知道廚師用類(lèi)似makeBurger(這樣的方法來(lái)烹飪。開(kāi)餐廚師準(zhǔn)備餐點(diǎn)。output(。餐廳的角色和職責(zé)一張訂單封裝了準(zhǔn)備餐點(diǎn)的請(qǐng)求。把訂單想象成一個(gè)用來(lái)請(qǐng)求準(zhǔn)備餐點(diǎn)的對(duì)象,和一般的對(duì)象一樣,訂單對(duì)象可以被傳遞:從女招待傳遞到訂單柜臺(tái),或者從女趙丹傳遞到階梯下一班的女找到,訂單的接口只包含一個(gè)方法就是orderUp(。這個(gè)方法封裝了準(zhǔn)備從哪點(diǎn)所需的動(dòng)作。訂單內(nèi)有一個(gè)到“需要進(jìn)行準(zhǔn)備工作的對(duì)象”(也就是廚師的引用。這一切都被瘋轉(zhuǎn)起來(lái),所以女招待不需要知道訂單上有什么,也不需要知道是誰(shuí)來(lái)準(zhǔn)備
5、餐點(diǎn)。女招待的工作是接收訂單,然后調(diào)用訂單的orderUp(方法。女招待其實(shí)不必?fù)?dān)心訂單的內(nèi)容是什么,或者由誰(shuí)來(lái)準(zhǔn)備餐點(diǎn),她只需要知道,訂單有一個(gè)orderUp(方法可以調(diào)用,這就夠了??觳蛷N師具備準(zhǔn)備餐點(diǎn)的知識(shí)??觳蛷N師是一種對(duì)象,他真正知道如何準(zhǔn)備餐點(diǎn),一旦女找到調(diào)用orderUp(方法,快餐廚師就接手,實(shí)現(xiàn)需要?jiǎng)?chuàng)建餐點(diǎn)的所有方法,女找到和廚師之間是徹底的解耦,女招待的訂單封裝了餐點(diǎn)的細(xì)節(jié),廚師只要調(diào)用每個(gè)訂單的方法即可。把采納定想著一種設(shè)計(jì)模式的一種模型,而這個(gè)模型允許將“發(fā)出請(qǐng)求的對(duì)象”和“接收與執(zhí)行這些請(qǐng)求的隊(duì)形”分隔開(kāi)來(lái),對(duì)于遙控器API,我們需要分隔開(kāi)“發(fā)送請(qǐng)求的按鈕”和“執(zhí)行請(qǐng)
6、求的廠商特定對(duì)象”。第一個(gè)命令對(duì)象實(shí)現(xiàn)命令接口首先,讓所有的命令對(duì)象實(shí)現(xiàn)相同的包含一個(gè)方法的接口,在餐廳的例子中,我們稱(chēng)此方法為orderUp(,然而,現(xiàn)在改為一般慣用的名稱(chēng)execute(。interface Commandpublic void execute(;實(shí)現(xiàn)一個(gè)打開(kāi)點(diǎn)燈的命令建設(shè)想實(shí)現(xiàn)一個(gè)打開(kāi)點(diǎn)燈的命令,根據(jù)廠商提供的類(lèi),Light 有兩個(gè)方法:on(和off(。class LightOnCommand implements CommandLight light;public LightOnCommand(Light lightthis.light=light;Overridep
7、ublic void execute( light.on(;使用命令對(duì)象假設(shè)我們有一個(gè)遙控器,它只有一個(gè)按鈕和對(duì)應(yīng)的插槽,可以控制一個(gè)裝置:class SimpleRemoteControlCommand slot;public SimpleRemoteControl(public void setCommand(Command commandslot=command;public void buttonWasPressed(slot.execute(;遙控器使用的簡(jiǎn)單測(cè)試下面的一點(diǎn)點(diǎn)代碼,用來(lái)測(cè)試上面的簡(jiǎn)單遙控器。class RemoteControlTestpublic static vo
8、id main(String args SimpleRemoteControl remote=new SimpleRemoteControl(;Light light=new Light(;LightOnCommand lightOn=new LightOnCommand(light; remote.setCommand(lightOn;remote.buttonWasPressed(;定義命令模式命令模式:將“請(qǐng)求”封裝成對(duì)象,一邊使用不同的請(qǐng)求、隊(duì)列或者日志來(lái)來(lái)參數(shù)化其他對(duì)象。命令模式也支持可撤銷(xiāo)的操作。我們知道一個(gè)命令對(duì)象通過(guò)在特定接收者上綁定一組動(dòng)作來(lái)封裝一個(gè)請(qǐng)求。要達(dá)到這點(diǎn),命令對(duì)象
9、間動(dòng)作和接收者包進(jìn)對(duì)象中,這個(gè)對(duì)象只暴露出一個(gè)execute(方法,當(dāng)此方法被調(diào)用的時(shí)候,接收者就會(huì)進(jìn)行這些動(dòng)作,從外面來(lái)看,其他對(duì)象不知道究竟哪個(gè)接收者進(jìn)行了那些動(dòng)作,只知道如果調(diào)動(dòng)execute(方法,請(qǐng)求的目的就能達(dá)到。上面只是簡(jiǎn)單的一個(gè)打開(kāi)電燈的命令,接下來(lái)我們看看最終的設(shè)計(jì):實(shí)現(xiàn)遙控器class RemoteControlCommand onCommands;Command offCommands;public RemoteControl(onCommands=new Command7; offCommands=new Command7; Command noCommand=new
10、NoCommand(; for(int i=0;i7;i onCommandsi=noCommand; offCommandsi=noCommand;public void setCommand(int slot,Command onCommand,Command offCommand onCommandsslot=onCommand; offCommandsslot=offCommand;public void onButtowWasPushed(int slot onCommandsslot.execute(;public void offButtowWasPushed(int slot
11、onCommandsslot.execute(;Overridepublic String toString( StringBuffer stringBuff=new StringBuffer(;stringBuff.append('n-Remote Control-n'for(int i=0;ionCommands.length;i stringBuff.append('slot' i ''onCommandsi.getClass(.getName(' ' offCommandsi.getClass(.getName( '
12、;n'return stringBuff.toString(;實(shí)現(xiàn)命令我們?cè)谇懊婧?jiǎn)單遙控器中手動(dòng)實(shí)現(xiàn)過(guò)LightOnCommand,關(guān)閉命令并沒(méi)有生命不同。class LightOffCommand implements CommandLight light;public LightOffCommand(Light lightthis.light=light;Overridepublic void execute( light.off(;在遙控器中的代碼有這樣一段代碼:Command noCommand=new NoCommand(;for(int i=0;i7;i onCommand
13、si=noCommand;offCommandsi=noCommand;NoCommadn:class NoCommand implements CommandOverridepublic void execute( 沒(méi)錯(cuò)NoCommadn對(duì)象是一個(gè)空對(duì)象,當(dāng)你不想返回一個(gè)又意義的對(duì)象時(shí),空對(duì)象就很有用,客戶(hù)也可以將處理null的責(zé)任轉(zhuǎn)移給空對(duì)象,遙控器不可能一出廠就設(shè)置了有意義的命令對(duì)象,所以提供了NoCommadn對(duì)象作為代用品,當(dāng)調(diào)用它的execute(方法時(shí),這種對(duì)象什么事情都不做。下面是這個(gè)題例的類(lèi)圖:撤銷(xiāo)1:當(dāng)命令支持撤銷(xiāo)時(shí),該命令就必須提供和execute(方法相反的undo(方
14、法,不管execute(剛才做什么,undo(都會(huì)倒轉(zhuǎn)過(guò)來(lái),這么一來(lái),在各個(gè)命令中加入undo(之前,我們必須先在Command接口中加入undo(方法。interface Commandpublic void execute(;public void undo(;2:我們從LightOnCommand開(kāi)始:class LightOnCommand implements CommandLight light;public LightOnCommand(Light lightthis.light=light;Overridepublic void execute( light.on(;Overr
15、idepublic void undo( light.off(;然后是LightOffCimmand:class LightOffCommand implements CommandLight light;public LightOffCommand(Light lightthis.light=light;Overridepublic void execute( light.off(;Overridepublic void undo( light.on(;3:要加上對(duì)撤銷(xiāo)按鈕的支持,我們必須對(duì)遙控器類(lèi)做一些小修改,加入一個(gè)新的實(shí)例變量,用來(lái)追蹤最后被調(diào)用的命令,然后,不管何時(shí)撤銷(xiāo)按鈕被按下,我
16、們可以取出這個(gè)命令并調(diào)用它的undo(方法。class RemoteControlCommand onCommands;Command offCommands;Command undoCommand;public RemoteControl(onCommands=new Command7; offCommands=new Command7; Command noCommand=new NoCommand(; for(int i=0;i7;i onCommandsi=noCommand; offCommandsi=noCommand;undoCommand=noCommand;public vo
17、id setCommand(int slot,Command onCommand,Command offCommand onCommandsslot=onCommand; offCommandsslot=offCommand;public void onButtowWasPushed(int slot onCommandsslot.execute(; undoCommand=onCommandsslot;public void offButtowWasPushed(int slotonCommandsslot.execute(;undoCommand=offCommandsslot;/當(dāng)按下撤
18、銷(xiāo)按鈕,我們調(diào)用undoButtowWasPushed實(shí)例變量的undo方法,就可以倒轉(zhuǎn)前一個(gè)命令。public void undoButtowWasPushed(undoCommand.undo(;Overridepublic String toString( StringBuffer stringBuff=new StringBuffer(;stringBuff.append('n-Remote Control-n'for(int i=0;ionCommands.length;i stringBuff.append('slot' i ''onCommandsi.getClass(.getName(' ' offCommandsi.getClass(.getName( 'n'return stringBuff.toString(;每個(gè)遙控器都具備“Party模式”打開(kāi)或關(guān)閉所有的電器。class MacroComm
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 班會(huì)設(shè)計(jì)班級(jí)活動(dòng)方案
- 班級(jí)舉行活動(dòng)方案
- 物資節(jié)約活動(dòng)方案
- 特殊教育學(xué)校活動(dòng)方案
- 煤礦立冬開(kāi)展活動(dòng)方案
- 玉淵潭團(tuán)建活動(dòng)方案
- 班級(jí)十歲兒童節(jié)活動(dòng)方案
- 生鮮老店?duì)I銷(xiāo)活動(dòng)方案
- 愛(ài)心企業(yè)贈(zèng)校服活動(dòng)方案
- 現(xiàn)場(chǎng)悼念活動(dòng)方案
- 職業(yè)行為習(xí)慣課件
- 2024年深圳市中考生物試卷真題(含答案解析)
- 新疆維吾爾自治區(qū)2024年普通高校招生單列類(lèi)(選考外語(yǔ))本科二批次投檔情況 (理工)
- 綠化養(yǎng)護(hù)服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- DB4451-T 1-2021《地理標(biāo)志產(chǎn)品+鳳凰單叢(樅)茶》-(高清現(xiàn)行)
- 消防管理檢查評(píng)分表
- 無(wú)人機(jī)駕駛員證照考試培訓(xùn)題庫(kù)與答案
- JJG 1149-2022 電動(dòng)汽車(chē)非車(chē)載充電機(jī)(試行)
- 2022年(詳細(xì)版)高中數(shù)學(xué)學(xué)業(yè)水平考試知識(shí)點(diǎn)
- 播音主持重音的教學(xué)課件
- 蛋糕制作工藝課件(PPT81張)
評(píng)論
0/150
提交評(píng)論