版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、2015 年 6 月 18 日問題描述2設(shè)計描述21、 duck1 詳細(xì)步驟2duck1 類圖42. duck2 詳細(xì)步驟4duck2 類圖53.duck3 詳細(xì)步驟6duck3 類圖74. duck4 詳細(xì)步驟7duck4 類圖95.duck5 詳細(xì)步驟9duck5 類圖116. duck6 詳細(xì)步驟11duck6 類圖14設(shè)計的評價14設(shè)計的擴充15總結(jié)15問題描述設(shè)計一個鴨子模擬器,可以實現(xiàn)鴨子、鴨鳴器、橡皮鴨的呱呱叫,鵝的咯咯叫。添加一名裝飾者,統(tǒng)計叫的次數(shù)。創(chuàng)建鴨子工廠,實現(xiàn)需要鴨子時,直接從工廠調(diào)用。將他們集結(jié)成群,允許群中有群,便于管理。觀察者,當(dāng)呱呱聲響起時,觀察者就會被通知,
2、統(tǒng)計通知它的鴨子的個數(shù)和像鴨子一樣叫的個數(shù)。設(shè)計時可以使用設(shè)計模式,應(yīng)用成設(shè)計模式能夠增強代碼的可復(fù)用性、可擴展性與可性,設(shè)計模式具有的設(shè)計上的彈性會給之后的變更帶來些便利。設(shè)計描述1、 duck1 詳細(xì)步驟1、創(chuàng)建一個 Quackable 接口,這樣就知道這個模擬器中,有哪些東西可以呱呱叫,像綠頭鴨、紅頭鴨,甚至可能還會看到橡皮鴨。package duck1;publicerface Quackablepublic void quack();Quackable 只需做好一件事 Quack(呱呱叫)2、設(shè)計一些具體的鴨子,來實現(xiàn) Quackable 接口public class Mallard
3、Duck implements Quackable 標(biāo)準(zhǔn)綠頭鴨public class RedheadDuck implements Quackable加入鴨鳴器和橡皮鴨public class DuckCall implements Quackable DuckCall(鴨鳴器)會呱呱叫,但聽起來并不十分像真的鴨叫public class RubberDuck implements Quackable 當(dāng) RubberDuck(橡皮鴨)呱呱叫時,其聲音是吱吱叫制造一個確認(rèn)鴨子會呱呱叫的模擬器public class DuckSimulatorpublic sic void main(Stri
4、ng args)main()方法將讓所有事情動起來DuckSimulator simulator = new DuckSimulator(); 創(chuàng)建一個模擬器,simulator.simulate();然后調(diào)用 simulator()方法void simulate()把每一種會叫的東西都產(chǎn)生一份實例,開始模擬每種鴨子void simulate(Quackable duck)重載了 simulate()方法來模擬一只鴨子duck.quack();剩下的事就讓多態(tài)發(fā)揮作用,無論傳入哪一種對象,多態(tài)都可調(diào)到正確的方法運行后出現(xiàn):Duck SimulatorQuackQuackKwakSqueakdu
5、ck1 類圖2. duck2 詳細(xì)步驟4、當(dāng)鴨子出現(xiàn)在這里的時候,就大概會有鴨子和鵝類。為這個模擬器設(shè)計了一個 Goose(鵝)package goosem_duck2;public class Goose /鵝的是咯咯5.鵝適配器的模擬望看到 Quackable 接口.既然鵝不會呱呱叫,可以利用適配器將鵝適配成鴨子.public class GooseAdapter implements QuackableGoose goose;public GooseAdapter(Goose goose)6. 模擬器總可以使用鵝了,Quackable。需要創(chuàng)建 Goose 對象, 將它包裝進適配器, 以
6、便實現(xiàn)public class DuckSimulatorpublic sic void main(String args)main()方法將讓所有的事情動起來DuckSimulator simulator = new DuckSimulator();創(chuàng)建一個模擬器,然后調(diào)用 simulator()方法void simulate()把每一種會叫的東西都產(chǎn)生一份實例,通過把 Goose 包裝進 GooseAdapter,就可以讓鵝像鴨子一樣System.out.prln(nDuck Simulator);開始模擬每種鴨子,一旦鵝被包裝起來,就可以把它當(dāng)作其他鴨子的 Quackable 對象voi
7、d simulate(Quackable duck)重載了 simulate()方法來模擬一只鴨子duck.quack();方法剩下的事就讓多態(tài)發(fā)揮作用,無論傳入哪一種對象,多態(tài)都可調(diào)到正確的7.測試一下測試時,simulate()會調(diào)用許多對象的 quack()方法,其中包括適配器的 quack()方法,結(jié)果出現(xiàn)咯咯叫(honk)Duck SimulatorQuackQuackKwakSqueakHonkduck2 類圖3.duck3 詳細(xì)步驟8.統(tǒng)計的次數(shù),通過把鴨子包裝進裝飾者對象,給鴨子一些行為(計算次數(shù)的行為)。package duck3publicclass QuackCounte
8、r implements QuackablesicnumberOfQuacks; 用靜態(tài)變量所有呱呱叫的次數(shù)publicQuackCounter (Quackable duck) 將 Quackable 當(dāng)作參數(shù)傳入構(gòu)造器,并在實例變量中。public void quack()duck.quack(); 當(dāng) quack()被調(diào)用時,就把調(diào)用委托給正在裝飾的 Quackable 對象numberOfQuacks+; 把的次數(shù)加一public s中發(fā)生的ic次數(shù)getQuacks()給裝飾者加入一個靜態(tài)方法,以便返回在所有的 Quackablereturn numberOfQuacks;9.更新模
9、擬器,以便創(chuàng)建被裝飾的鴨子,包裝在 QuackCounter 裝飾者中被實例化的每個Quackable 對象public class DuckSimulator public sic void main(String args)main()方法將讓所有的事情動起來DuckSimulator simulator = new DuckSimulator();創(chuàng)建一個模擬器,然后調(diào)用 simulator()方法Quackable mallardDuck = new QuackCounter (new MallardDuck();把每一種會叫的東西都產(chǎn)生一份實例Quackable gooseDuck
10、= new GooseAdapter(new Goose(); 通 過 把 Goose 包 裝 進GooseAdapter,就可以讓鵝像鴨子一樣simulate(mallardDuck); 開始模擬每種鴨子simulate(gooseDuck); 一旦鵝被包裝起來,就可以把它當(dāng)作其他鴨子的 Quackable 對象system.out.prln(The ducks quacked + QuackCounter.getQuacks() + times);在這里為呱呱叫學(xué)家收集呱呱叫行為void simulate(Quackable duck)重載了 simulate()方法來模擬一只鴨子duck
11、.quack();剩下的事就讓多態(tài)發(fā)揮作用,無論傳入哪一種對象,多態(tài)都可調(diào)到正確的方法輸出:Duck Simulator:With DecoratorQuackQuackKwakSqueakHonkThe ducks quacked4timesduck3 類圖4. duck4 詳細(xì)步驟10.需要工廠產(chǎn)生鴨子需要一些質(zhì)量控制來確保鴨子一定是被包裝起來的.要建造一個工廠,創(chuàng)建裝飾過得鴨子.此工廠應(yīng)該生產(chǎn)各種不同類型的鴨子的產(chǎn)品用抽象工廠模式.,所以使public abstract class AbstractDuckFactory 定義一個抽象工廠,它的子類們會創(chuàng)建不同的public abstra
12、ct Quackable createMallardDuck(); 每個方法創(chuàng)建一種鴨子創(chuàng)建一個工廠,此工廠創(chuàng)建沒有裝飾者的鴨子public class DuckFactory extends AbstractDuckFactory DuckFactory 擴展抽象工廠public Quackable createMallardDuck() 每個方法創(chuàng)建一個產(chǎn)品, 一種特定種類的Quackable,模擬器并不知道實際產(chǎn)品是什么,值知道它實現(xiàn)了 Quackable 接口現(xiàn)在創(chuàng)建真正需要的工廠 CountingDuckFactorypublic class CountingDuckFactory
13、extends AbstractDuckFactory11.設(shè)置模擬器來使用這個工廠,創(chuàng)建一個多態(tài)的方法,此方法需要一個創(chuàng)建對象的工廠,通過傳入不同的工廠,就會得到不同的產(chǎn)品。public class DuckSimulator public sic void main(String args)main()方法將讓所有的事情動起來DuckSimulator simulator = new DuckSimulator();創(chuàng)建一個模擬器,然后調(diào)用 simulator()方法AbstractDuckFactory duckFactory = new CountingDuckFactory(); 創(chuàng)
14、建工廠,準(zhǔn)備把它傳入 simulate()方法voidsimulate(AbstractDuckFactoryduckFactory)simulate()方法需要AbstractDuckFactory 參數(shù),利用它創(chuàng)建鴨子,而不是直接實例化鴨子Quackable gooseDuck = new GooseAdapter(new Goose(); 通 過 把 Goose 包 裝 進GooseAdapter,就可以讓鵝像鴨子一樣simulate(mallardDuck); 開始模擬每種鴨子simulate(gooseDuck); /一旦鵝被包裝起來,對象就可以把它當(dāng)作其他鴨子的 Quackable
15、System.out.prln(The ducks quacked + QuackCounter.getQuacks() + times);在這里為呱呱叫學(xué)家收集呱呱叫行為void simulate(Quackable duck)重載了 simulate()方法來模擬一只鴨子duck.quack();剩下的事就讓多態(tài)發(fā)揮作用,無論傳入哪一種對象,多態(tài)都可調(diào)到正確的方法執(zhí)行后:Duck Simulator:With DecoratorQuackQuackKwakSqueakHonkThe ducks quacked4timesduck4 類圖5.duck5 詳細(xì)步驟12.讓創(chuàng)建一群鴨子(實際上是
16、一群 Quackable)publicclass Flock implements Quackablepublicvoid add(Quackable quacker)publicvoid quack()Quackable quacker = (Quackable)iterator.next();13.修改模擬器,需要一些鴨子能進入組合結(jié)構(gòu)的代碼。public class DuckSimulator public sic void main(String args)main()方法將讓所有的事情動起來DuckSimulator simulator = new DuckSimulator();創(chuàng)
17、建一個模擬器,然后調(diào)用 simulator()方法AbstractDuckFactory duckFactory = new CountingDuckFactory();創(chuàng)建工廠,準(zhǔn)備把它傳入 simulate()方法voidsimulate(AbstractDuckFactoryduckFactory)simulate()方法需要AbstractDuckFactory 參數(shù),利用它創(chuàng)建鴨子,而不是直接實例化鴨子Quackable gooseDuck = new GooseAdapter(new Goose(); 通 過 把 Goose 包 裝 進GooseAdapter,就可以讓鵝像鴨子一樣
18、simulate(mallardDuck); 開始模擬每種鴨子simulate(gooseDuck); 一旦鵝被包裝起來,就可以把它當(dāng)作其他鴨子的 Quackable 對象System.out.prln(The ducks quacked + QuackCounter.getQuacks() + times);在這里為呱呱叫學(xué)家收集呱呱叫行為void simulate(Quackable duck)重載了 simulate()方法來模擬一只鴨子duck.quack();剩下的事就讓多態(tài)發(fā)揮作用,無論傳入哪一種對象,多態(tài)都可調(diào)到正確的方法執(zhí)行結(jié)果:Duck Simulator:With Deco
19、rator - FlocksDuck Simulator:Whole Flock SimulationQuackKwakSqueakHonkQuackQuackQuackQuackDuck Simulator:MallardFlock SimulationQuackQuackQuackQuackThe ducks quacked 11timesduck5 類圖6. duck6 詳細(xì)步驟14.想要觀察個別鴨子的行為適用觀察者模式,首先需要一個 Observable 接口,所謂的Observable 就是被觀察的對象。Observable 是需要和通知觀察者的方法。publicerface Qua
20、ckObservable QuackObservable 是一個接口, 任何想被觀察的Quackable 都必須實現(xiàn) QuackObservable 接口public void registerObserver(Observable observer); 當(dāng)具有觀察者的方法,任何實現(xiàn)了 Observable 接口的對象都可以呱呱叫,稍后會定義觀察者接口publicvoid notifyObservers();它也有通知觀察者的方法現(xiàn)在需要確定所有的 Quackable 都實現(xiàn)此接口publicerface Quackable extends QuackObservable干脆讓 Quackab
21、le 來擴展接口publicvoid quack();Quackable 只需做好一件事 Quack(呱呱叫)15.、現(xiàn)在須確定所有實現(xiàn) Quakable 的具體類都能夠扮演 QuackObservable 的角色,要在另一個被稱為 Observable 的類中封裝和通知的代碼, 然后將它和QuackObservable 組合在一起,這樣用都委托給 Observable 輔助類只需要一份代碼即可,QuackObservable 所有的調(diào)public class Observable implements QuackObservableObservable 必須 實現(xiàn)QuackObservabl
22、e 因為它們具有一組相同的方法,QuackObservable 會將這些方法的調(diào)用轉(zhuǎn)給Observable 的方法public Observable(QuackObservable duck)再此構(gòu)造器中,傳進了 QuackObservable,當(dāng)通知發(fā)生時,觀察者把此對象傳過去,讓觀察者知道叫的對象public void registerObserver(Observer observer)觀察者public void notifyObservers()通知觀察者整合 Observable 輔助類和 Quakable 類只要確定 Quakable 類是和 Observable 組合在一起的,
23、并且他們知道怎樣來委托工作,然后,他們就準(zhǔn)備好成為 Observable,下面是MallardDuck 的實現(xiàn),其他的鴨子實現(xiàn)也類似public class MallardDuck2 extends MallardDuck implements QuackablePlusObservable duck6;每個 Quackable 都有一個 Quackable 實例變量notifyObservers();呱呱叫時,讓觀察者知道public void registerObserver(Observer observer)public void notifyObservers() 委托給輔助類需要把
24、模式的 Observer 端完成,還需要一些觀察者 Observerpublicerface Observublic void update(QuackObservable duck); Observer 接口只有一個方法 update(),他需要傳入正在呱呱叫的對象(QuackObservable)public class Quackologist implements Observerpublic void update(QuackObservable duck)實現(xiàn)呱呱叫更新模擬器,準(zhǔn)備開始觀察void simulate(AbstractDuckFactory duckFactory)
25、創(chuàng)建鴨子工廠和鴨子,創(chuàng)建群Quackologist quackologist = new Quackologist();創(chuàng)建 Quackologist,把它個群的觀察者成為一flockOfDucks.registerObserver(quackologist);simulate(flockOfDucks);模擬整個群運行結(jié)果:Duck Simulator: With ObserverQuackQuackologist:duck6.RedheadDuck212ac706a just quacked.KwakQuackologist:duck6.DuckCall2770848b9 just quacked.SqueakQuackologist:duck6.RubberDuck240dea6bc just quacked.Quackologist:duck6.GooseAdapter25994a1e9 just quacked.QuackQuackologist:duck6.MallardDuck22d11f5f1 just quacked.QuackQuackologist:duck6.MallardDuck27629b854 just quacked.QuackQuackologist: duck6.MallardDuck22d04cf
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年n95口罩醫(yī)療物資采購合同規(guī)范2篇
- 2024年度個人股權(quán)轉(zhuǎn)讓與股權(quán)質(zhì)押合同3篇
- 2024年度環(huán)??萍既牍煞旨t合同3篇
- 2024年度拼多多平臺運營合同3篇
- 2024年度鋼材租賃與售后服務(wù)綜合合同3篇
- 2024年度專業(yè)安保團隊人員勞動合同范本(含職業(yè)健康檢查)
- 2024年土地資源保護與生態(tài)環(huán)境咨詢合同3篇
- 2024年電力安全評價技術(shù)服務(wù)合同正規(guī)范范本
- 2024年度企業(yè)重組涉及的知識產(chǎn)權(quán)轉(zhuǎn)讓合同3篇
- 2024版信息技術(shù)公司提供云計算服務(wù)合同3篇
- 中國校服產(chǎn)業(yè)挑戰(zhàn)與機遇分析報告 2024
- 監(jiān)理企業(yè)技術(shù)管理制度
- 2022版義務(wù)教育物理課程標(biāo)準(zhǔn)
- 山東省日照市2023-2024學(xué)年七年級上學(xué)期期末數(shù)學(xué)試題(含答案)
- 上海華東師大二附中2025屆高一數(shù)學(xué)第一學(xué)期期末檢測試題含解析
- 新教科版六年級上冊科學(xué)全冊知識點(期末總復(fù)習(xí)資料)
- 《靜女》《涉江采芙蓉》對比閱讀教學(xué)設(shè)計 2023-2024學(xué)年統(tǒng)編版高中語文必修上冊
- 高速鐵路概論 課件 第3章 高速鐵路車站
- 2024-2030年水培蔬菜行業(yè)市場發(fā)展分析及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2024年部編版語文五年級上冊全冊單元檢測題及答案(共8套)
- 集成電路制造工藝 課件 6光刻工藝2
評論
0/150
提交評論