




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、headfirst設(shè)計模式讀書總結(jié)命令模式在本章,我們將把封裝帶到一個全新的境界:把方法調(diào)用(method invocation封裝起來。通過封裝發(fā)發(fā)調(diào)用,我們可以把運(yùn)算塊包裝成形。所以調(diào)用此運(yùn)算的對象不需要關(guān)心事情是如何進(jìn)行的。只要知道如何使用包裝成形的方法來完成它就可以。通過封裝方法調(diào)用,也可以做一些很聰明的事情,例如記錄日志,或者重復(fù)使用這些封裝來實(shí)現(xiàn)撤銷(undo。題例:家電自動化設(shè)計一個家電自動化遙控器的API。這個遙控器具有七個可編程的插槽,每個插槽都有對應(yīng)的開關(guān)按鈕,這個遙控器還具備一個整體的撤銷按鈕。希望你能夠創(chuàng)建一組控制遙控器的API,讓每個插槽都能夠控制一個或一組裝置,能夠
2、控制目前的裝置和任何未來可能出現(xiàn)的裝置,這一點(diǎn)很重要。(這里有一組Java類,這些類時由多個廠商開發(fā)出來的,用來控制家電自動化裝置,例如點(diǎn)燈,風(fēng)扇,熱水器,音響設(shè)備和其他類似的可控制裝置。上面是很多的廠商類,看不清不要緊。你只要知道它很多,控制各種電器。有許多類都具備on(和off(方法,除外還有其他的一些方法。遙控器應(yīng)該知道如何解讀按鈕被按下的動作,然后發(fā)出正確的請求,但是遙控器不需要知道這些家電自動化的細(xì)節(jié),或者如何打開熱水器。提示:命令模式可將“動作的請求者”從“動作的執(zhí)行者”對象中解耦,在我們的題例中,請求者是遙控器,而執(zhí)行者對象就是廠商類。利用命令對象,把請求(打開點(diǎn)燈封裝成一個特定
3、對象(客廳點(diǎn)燈對象,如果對每個按鈕都存一個命令對象,那么當(dāng)按鈕被按下的時候,就可以請命令對象做相關(guān)的工作,遙控器并不需要知道工作內(nèi)容是什么,只要有個命令對象能和正確的對象溝通,把事情做好久可以了。命令模式的簡單介紹(如果你已經(jīng)理解命令模式可以不看下面的例子餐廳解析:研究顧客,女招待,訂單,以及快餐廚師之間的交互。1:你,也就是顧客,把訂單交個女招待。2:女招待拿了訂單放在訂單柜臺,然后喊了一聲“訂單來了”。3:快餐廚師根據(jù)訂單準(zhǔn)備餐點(diǎn)。讓我們更詳細(xì)地研究這個交互顧客知道自己要吃什么,并創(chuàng)建了一張訂單createOrder(,訂單包含一個訂單表格,顧客訂購的餐點(diǎn)項(xiàng)目寫在上面。女招待拿走了訂單te
4、keOrder(,放在訂單柜臺,然后調(diào)用orderUp(方法,通知廚師準(zhǔn)備餐點(diǎn)。訂單上有所有準(zhǔn)備餐點(diǎn)是只是,知道廚師用類似makeBurger(這樣的方法來烹飪。開餐廚師準(zhǔn)備餐點(diǎn)。output(。餐廳的角色和職責(zé)一張訂單封裝了準(zhǔn)備餐點(diǎn)的請求。把訂單想象成一個用來請求準(zhǔn)備餐點(diǎn)的對象,和一般的對象一樣,訂單對象可以被傳遞:從女招待傳遞到訂單柜臺,或者從女趙丹傳遞到階梯下一班的女找到,訂單的接口只包含一個方法就是orderUp(。這個方法封裝了準(zhǔn)備從哪點(diǎn)所需的動作。訂單內(nèi)有一個到“需要進(jìn)行準(zhǔn)備工作的對象”(也就是廚師的引用。這一切都被瘋轉(zhuǎn)起來,所以女招待不需要知道訂單上有什么,也不需要知道是誰來準(zhǔn)備
5、餐點(diǎn)。女招待的工作是接收訂單,然后調(diào)用訂單的orderUp(方法。女招待其實(shí)不必?fù)?dān)心訂單的內(nèi)容是什么,或者由誰來準(zhǔn)備餐點(diǎn),她只需要知道,訂單有一個orderUp(方法可以調(diào)用,這就夠了。快餐廚師具備準(zhǔn)備餐點(diǎn)的知識。快餐廚師是一種對象,他真正知道如何準(zhǔn)備餐點(diǎn),一旦女找到調(diào)用orderUp(方法,快餐廚師就接手,實(shí)現(xiàn)需要創(chuàng)建餐點(diǎn)的所有方法,女找到和廚師之間是徹底的解耦,女招待的訂單封裝了餐點(diǎn)的細(xì)節(jié),廚師只要調(diào)用每個訂單的方法即可。把采納定想著一種設(shè)計模式的一種模型,而這個模型允許將“發(fā)出請求的對象”和“接收與執(zhí)行這些請求的隊(duì)形”分隔開來,對于遙控器API,我們需要分隔開“發(fā)送請求的按鈕”和“執(zhí)行請
6、求的廠商特定對象”。第一個命令對象實(shí)現(xiàn)命令接口首先,讓所有的命令對象實(shí)現(xiàn)相同的包含一個方法的接口,在餐廳的例子中,我們稱此方法為orderUp(,然而,現(xiàn)在改為一般慣用的名稱execute(。interface Commandpublic void execute(;實(shí)現(xiàn)一個打開點(diǎn)燈的命令建設(shè)想實(shí)現(xiàn)一個打開點(diǎn)燈的命令,根據(jù)廠商提供的類,Light 有兩個方法:on(和off(。class LightOnCommand implements CommandLight light;public LightOnCommand(Light lightthis.light=light;Overridep
7、ublic void execute( light.on(;使用命令對象假設(shè)我們有一個遙控器,它只有一個按鈕和對應(yīng)的插槽,可以控制一個裝置:class SimpleRemoteControlCommand slot;public SimpleRemoteControl(public void setCommand(Command commandslot=command;public void buttonWasPressed(slot.execute(;遙控器使用的簡單測試下面的一點(diǎn)點(diǎ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(;定義命令模式命令模式:將“請求”封裝成對象,一邊使用不同的請求、隊(duì)列或者日志來來參數(shù)化其他對象。命令模式也支持可撤銷的操作。我們知道一個命令對象通過在特定接收者上綁定一組動作來封裝一個請求。要達(dá)到這點(diǎn),命令對象
9、間動作和接收者包進(jìn)對象中,這個對象只暴露出一個execute(方法,當(dāng)此方法被調(diào)用的時候,接收者就會進(jìn)行這些動作,從外面來看,其他對象不知道究竟哪個接收者進(jìn)行了那些動作,只知道如果調(diào)動execute(方法,請求的目的就能達(dá)到。上面只是簡單的一個打開電燈的命令,接下來我們看看最終的設(shè)計:實(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)命令我們在前面簡單遙控器中手動實(shí)現(xiàn)過LightOnCommand,關(guān)閉命令并沒有生命不同。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( 沒錯NoCommadn對象是一個空對象,當(dāng)你不想返回一個又意義的對象時,空對象就很有用,客戶也可以將處理null的責(zé)任轉(zhuǎn)移給空對象,遙控器不可能一出廠就設(shè)置了有意義的命令對象,所以提供了NoCommadn對象作為代用品,當(dāng)調(diào)用它的execute(方法時,這種對象什么事情都不做。下面是這個題例的類圖:撤銷1:當(dāng)命令支持撤銷時,該命令就必須提供和execute(方法相反的undo(方
14、法,不管execute(剛才做什么,undo(都會倒轉(zhuǎn)過來,這么一來,在各個命令中加入undo(之前,我們必須先在Command接口中加入undo(方法。interface Commandpublic void execute(;public void undo(;2:我們從LightOnCommand開始: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:要加上對撤銷按鈕的支持,我們必須對遙控器類做一些小修改,加入一個新的實(shí)例變量,用來追蹤最后被調(diào)用的命令,然后,不管何時撤銷按鈕被按下,我
16、們可以取出這個命令并調(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、銷按鈕,我們調(diào)用undoButtowWasPushed實(shí)例變量的undo方法,就可以倒轉(zhuǎn)前一個命令。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(;每個遙控器都具備“Party模式”打開或關(guān)閉所有的電器。class MacroComm
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 機(jī)務(wù)材料考試題及答案
- 心理咨詢的技術(shù)與方法探討試題及答案
- 藥劑類考試重要環(huán)節(jié)試題及答案
- 精簡西醫(yī)臨床知識點(diǎn)梳理試題及答案
- 心理咨詢師考試常見謬誤試題及答案
- 2025貴州省安全員《A證》考試題庫
- 探索2024文化產(chǎn)業(yè)管理試題及答案
- 激光技術(shù)設(shè)備功能試題及答案
- 藥物的臨床前研究階段試題及答案
- 法律考研基礎(chǔ)試題及答案
- 山東省高中名校2025屆高三4月校際聯(lián)合檢測大聯(lián)考生物試題及答案
- 2025年03月如東縣事業(yè)單位工作人員120人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 2024北京八中高一(下)期中英語試題及答案
- 檳榔合作協(xié)議合同
- 歡樂購物街(教案)-2024-2025學(xué)年一年級下冊數(shù)學(xué)人教版
- 【9物一模】2025年安徽省合肥市蜀山區(qū)九年級中考一模物理試卷(含答案)
- 淺談南京市區(qū)地形地貌和工程地質(zhì)層構(gòu)成
- 【模型與方法】2025屆高考物理二輪復(fù)習(xí)熱點(diǎn)題型歸類計算4 電磁感應(yīng)綜合計算問題(原卷版)
- 2025年中鐵快運(yùn)股份有限公司招聘(98人)筆試參考題庫附帶答案詳解
- 2025年武漢數(shù)學(xué)四調(diào)試題及答案
- 職業(yè)病防護(hù)設(shè)施與個體防護(hù)用品的使用和維護(hù)
評論
0/150
提交評論