版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2015 年 6 月 18 日問(wèn)題描述2設(shè)計(jì)描述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è)計(jì)的評(píng)價(jià)14設(shè)計(jì)的擴(kuò)充15總結(jié)15問(wèn)題描述設(shè)計(jì)一個(gè)鴨子模擬器,可以實(shí)現(xiàn)鴨子、鴨鳴器、橡皮鴨的呱呱叫,鵝的咯咯叫。添加一名裝飾者,統(tǒng)計(jì)叫的次數(shù)。創(chuàng)建鴨子工廠,實(shí)現(xiàn)需要鴨子時(shí),直接從工廠調(diào)用。將他們集結(jié)成群,允許群中有群,便于管理。觀察者,當(dāng)呱呱聲響起時(shí),觀察者就會(huì)被通知,
2、統(tǒng)計(jì)通知它的鴨子的個(gè)數(shù)和像鴨子一樣叫的個(gè)數(shù)。設(shè)計(jì)時(shí)可以使用設(shè)計(jì)模式,應(yīng)用成設(shè)計(jì)模式能夠增強(qiáng)代碼的可復(fù)用性、可擴(kuò)展性與可性,設(shè)計(jì)模式具有的設(shè)計(jì)上的彈性會(huì)給之后的變更帶來(lái)些便利。設(shè)計(jì)描述1、 duck1 詳細(xì)步驟1、創(chuàng)建一個(gè) Quackable 接口,這樣就知道這個(gè)模擬器中,有哪些東西可以呱呱叫,像綠頭鴨、紅頭鴨,甚至可能還會(huì)看到橡皮鴨。package duck1;publicerface Quackablepublic void quack();Quackable 只需做好一件事 Quack(呱呱叫)2、設(shè)計(jì)一些具體的鴨子,來(lái)實(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(鴨鳴器)會(huì)呱呱叫,但聽起來(lái)并不十分像真的鴨叫public class RubberDuck implements Quackable 當(dāng) RubberDuck(橡皮鴨)呱呱叫時(shí),其聲音是吱吱叫制造一個(gè)確認(rèn)鴨子會(huì)呱呱叫的模擬器public class DuckSimulatorpublic sic void main(Stri
4、ng args)main()方法將讓所有事情動(dòng)起來(lái)DuckSimulator simulator = new DuckSimulator(); 創(chuàng)建一個(gè)模擬器,simulator.simulate();然后調(diào)用 simulator()方法void simulate()把每一種會(huì)叫的東西都產(chǎn)生一份實(shí)例,開始模擬每種鴨子void simulate(Quackable duck)重載了 simulate()方法來(lái)模擬一只鴨子duck.quack();剩下的事就讓多態(tài)發(fā)揮作用,無(wú)論傳入哪一種對(duì)象,多態(tài)都可調(diào)到正確的方法運(yùn)行后出現(xiàn):Duck SimulatorQuackQuackKwakSqueakdu
5、ck1 類圖2. duck2 詳細(xì)步驟4、當(dāng)鴨子出現(xiàn)在這里的時(shí)候,就大概會(huì)有鴨子和鵝類。為這個(gè)模擬器設(shè)計(jì)了一個(gè) Goose(鵝)package goosem_duck2;public class Goose /鵝的是咯咯5.鵝適配器的模擬望看到 Quackable 接口.既然鵝不會(huì)呱呱叫,可以利用適配器將鵝適配成鴨子.public class GooseAdapter implements QuackableGoose goose;public GooseAdapter(Goose goose)6. 模擬器總可以使用鵝了,Quackable。需要?jiǎng)?chuàng)建 Goose 對(duì)象, 將它包裝進(jìn)適配器, 以
6、便實(shí)現(xiàn)public class DuckSimulatorpublic sic void main(String args)main()方法將讓所有的事情動(dòng)起來(lái)DuckSimulator simulator = new DuckSimulator();創(chuàng)建一個(gè)模擬器,然后調(diào)用 simulator()方法void simulate()把每一種會(huì)叫的東西都產(chǎn)生一份實(shí)例,通過(guò)把 Goose 包裝進(jìn) GooseAdapter,就可以讓鵝像鴨子一樣System.out.prln(nDuck Simulator);開始模擬每種鴨子,一旦鵝被包裝起來(lái),就可以把它當(dāng)作其他鴨子的 Quackable 對(duì)象voi
7、d simulate(Quackable duck)重載了 simulate()方法來(lái)模擬一只鴨子duck.quack();方法剩下的事就讓多態(tài)發(fā)揮作用,無(wú)論傳入哪一種對(duì)象,多態(tài)都可調(diào)到正確的7.測(cè)試一下測(cè)試時(shí),simulate()會(huì)調(diào)用許多對(duì)象的 quack()方法,其中包括適配器的 quack()方法,結(jié)果出現(xiàn)咯咯叫(honk)Duck SimulatorQuackQuackKwakSqueakHonkduck2 類圖3.duck3 詳細(xì)步驟8.統(tǒng)計(jì)的次數(shù),通過(guò)把鴨子包裝進(jìn)裝飾者對(duì)象,給鴨子一些行為(計(jì)算次數(shù)的行為)。package duck3publicclass QuackCounte
8、r implements QuackablesicnumberOfQuacks; 用靜態(tài)變量所有呱呱叫的次數(shù)publicQuackCounter (Quackable duck) 將 Quackable 當(dāng)作參數(shù)傳入構(gòu)造器,并在實(shí)例變量中。public void quack()duck.quack(); 當(dāng) quack()被調(diào)用時(shí),就把調(diào)用委托給正在裝飾的 Quackable 對(duì)象numberOfQuacks+; 把的次數(shù)加一public s中發(fā)生的ic次數(shù)getQuacks()給裝飾者加入一個(gè)靜態(tài)方法,以便返回在所有的 Quackablereturn numberOfQuacks;9.更新模
9、擬器,以便創(chuàng)建被裝飾的鴨子,包裝在 QuackCounter 裝飾者中被實(shí)例化的每個(gè)Quackable 對(duì)象public class DuckSimulator public sic void main(String args)main()方法將讓所有的事情動(dòng)起來(lái)DuckSimulator simulator = new DuckSimulator();創(chuàng)建一個(gè)模擬器,然后調(diào)用 simulator()方法Quackable mallardDuck = new QuackCounter (new MallardDuck();把每一種會(huì)叫的東西都產(chǎn)生一份實(shí)例Quackable gooseDuck
10、= new GooseAdapter(new Goose(); 通 過(guò) 把 Goose 包 裝 進(jìn)GooseAdapter,就可以讓鵝像鴨子一樣simulate(mallardDuck); 開始模擬每種鴨子simulate(gooseDuck); 一旦鵝被包裝起來(lái),就可以把它當(dāng)作其他鴨子的 Quackable 對(duì)象system.out.prln(The ducks quacked + QuackCounter.getQuacks() + times);在這里為呱呱叫學(xué)家收集呱呱叫行為void simulate(Quackable duck)重載了 simulate()方法來(lái)模擬一只鴨子duck
11、.quack();剩下的事就讓多態(tài)發(fā)揮作用,無(wú)論傳入哪一種對(duì)象,多態(tài)都可調(diào)到正確的方法輸出:Duck Simulator:With DecoratorQuackQuackKwakSqueakHonkThe ducks quacked4timesduck3 類圖4. duck4 詳細(xì)步驟10.需要工廠產(chǎn)生鴨子需要一些質(zhì)量控制來(lái)確保鴨子一定是被包裝起來(lái)的.要建造一個(gè)工廠,創(chuàng)建裝飾過(guò)得鴨子.此工廠應(yīng)該生產(chǎn)各種不同類型的鴨子的產(chǎn)品用抽象工廠模式.,所以使public abstract class AbstractDuckFactory 定義一個(gè)抽象工廠,它的子類們會(huì)創(chuàng)建不同的public abstra
12、ct Quackable createMallardDuck(); 每個(gè)方法創(chuàng)建一種鴨子創(chuàng)建一個(gè)工廠,此工廠創(chuàng)建沒(méi)有裝飾者的鴨子public class DuckFactory extends AbstractDuckFactory DuckFactory 擴(kuò)展抽象工廠public Quackable createMallardDuck() 每個(gè)方法創(chuàng)建一個(gè)產(chǎn)品, 一種特定種類的Quackable,模擬器并不知道實(shí)際產(chǎn)品是什么,值知道它實(shí)現(xiàn)了 Quackable 接口現(xiàn)在創(chuàng)建真正需要的工廠 CountingDuckFactorypublic class CountingDuckFactory
13、extends AbstractDuckFactory11.設(shè)置模擬器來(lái)使用這個(gè)工廠,創(chuàng)建一個(gè)多態(tài)的方法,此方法需要一個(gè)創(chuàng)建對(duì)象的工廠,通過(guò)傳入不同的工廠,就會(huì)得到不同的產(chǎn)品。public class DuckSimulator public sic void main(String args)main()方法將讓所有的事情動(dòng)起來(lái)DuckSimulator simulator = new DuckSimulator();創(chuàng)建一個(gè)模擬器,然后調(diào)用 simulator()方法AbstractDuckFactory duckFactory = new CountingDuckFactory(); 創(chuàng)
14、建工廠,準(zhǔn)備把它傳入 simulate()方法voidsimulate(AbstractDuckFactoryduckFactory)simulate()方法需要AbstractDuckFactory 參數(shù),利用它創(chuàng)建鴨子,而不是直接實(shí)例化鴨子Quackable gooseDuck = new GooseAdapter(new Goose(); 通 過(guò) 把 Goose 包 裝 進(jìn)GooseAdapter,就可以讓鵝像鴨子一樣simulate(mallardDuck); 開始模擬每種鴨子simulate(gooseDuck); /一旦鵝被包裝起來(lái),對(duì)象就可以把它當(dāng)作其他鴨子的 Quackable
15、System.out.prln(The ducks quacked + QuackCounter.getQuacks() + times);在這里為呱呱叫學(xué)家收集呱呱叫行為void simulate(Quackable duck)重載了 simulate()方法來(lái)模擬一只鴨子duck.quack();剩下的事就讓多態(tài)發(fā)揮作用,無(wú)論傳入哪一種對(duì)象,多態(tài)都可調(diào)到正確的方法執(zhí)行后:Duck Simulator:With DecoratorQuackQuackKwakSqueakHonkThe ducks quacked4timesduck4 類圖5.duck5 詳細(xì)步驟12.讓創(chuàng)建一群鴨子(實(shí)際上是
16、一群 Quackable)publicclass Flock implements Quackablepublicvoid add(Quackable quacker)publicvoid quack()Quackable quacker = (Quackable)iterator.next();13.修改模擬器,需要一些鴨子能進(jìn)入組合結(jié)構(gòu)的代碼。public class DuckSimulator public sic void main(String args)main()方法將讓所有的事情動(dòng)起來(lái)DuckSimulator simulator = new DuckSimulator();創(chuàng)
17、建一個(gè)模擬器,然后調(diào)用 simulator()方法AbstractDuckFactory duckFactory = new CountingDuckFactory();創(chuàng)建工廠,準(zhǔn)備把它傳入 simulate()方法voidsimulate(AbstractDuckFactoryduckFactory)simulate()方法需要AbstractDuckFactory 參數(shù),利用它創(chuàng)建鴨子,而不是直接實(shí)例化鴨子Quackable gooseDuck = new GooseAdapter(new Goose(); 通 過(guò) 把 Goose 包 裝 進(jìn)GooseAdapter,就可以讓鵝像鴨子一樣
18、simulate(mallardDuck); 開始模擬每種鴨子simulate(gooseDuck); 一旦鵝被包裝起來(lái),就可以把它當(dāng)作其他鴨子的 Quackable 對(duì)象System.out.prln(The ducks quacked + QuackCounter.getQuacks() + times);在這里為呱呱叫學(xué)家收集呱呱叫行為void simulate(Quackable duck)重載了 simulate()方法來(lái)模擬一只鴨子duck.quack();剩下的事就讓多態(tài)發(fā)揮作用,無(wú)論傳入哪一種對(duì)象,多態(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.想要觀察個(gè)別鴨子的行為適用觀察者模式,首先需要一個(gè) Observable 接口,所謂的Observable 就是被觀察的對(duì)象。Observable 是需要和通知觀察者的方法。publicerface Qua
20、ckObservable QuackObservable 是一個(gè)接口, 任何想被觀察的Quackable 都必須實(shí)現(xiàn) QuackObservable 接口public void registerObserver(Observable observer); 當(dāng)具有觀察者的方法,任何實(shí)現(xiàn)了 Observable 接口的對(duì)象都可以呱呱叫,稍后會(huì)定義觀察者接口publicvoid notifyObservers();它也有通知觀察者的方法現(xiàn)在需要確定所有的 Quackable 都實(shí)現(xiàn)此接口publicerface Quackable extends QuackObservable干脆讓 Quackab
21、le 來(lái)擴(kuò)展接口publicvoid quack();Quackable 只需做好一件事 Quack(呱呱叫)15.、現(xiàn)在須確定所有實(shí)現(xiàn) Quakable 的具體類都能夠扮演 QuackObservable 的角色,要在另一個(gè)被稱為 Observable 的類中封裝和通知的代碼, 然后將它和QuackObservable 組合在一起,這樣用都委托給 Observable 輔助類只需要一份代碼即可,QuackObservable 所有的調(diào)public class Observable implements QuackObservableObservable 必須 實(shí)現(xiàn)QuackObservabl
22、e 因?yàn)樗鼈兙哂幸唤M相同的方法,QuackObservable 會(huì)將這些方法的調(diào)用轉(zhuǎn)給Observable 的方法public Observable(QuackObservable duck)再此構(gòu)造器中,傳進(jìn)了 QuackObservable,當(dāng)通知發(fā)生時(shí),觀察者把此對(duì)象傳過(guò)去,讓觀察者知道叫的對(duì)象public void registerObserver(Observer observer)觀察者public void notifyObservers()通知觀察者整合 Observable 輔助類和 Quakable 類只要確定 Quakable 類是和 Observable 組合在一起的,
23、并且他們知道怎樣來(lái)委托工作,然后,他們就準(zhǔn)備好成為 Observable,下面是MallardDuck 的實(shí)現(xiàn),其他的鴨子實(shí)現(xiàn)也類似public class MallardDuck2 extends MallardDuck implements QuackablePlusObservable duck6;每個(gè) Quackable 都有一個(gè) Quackable 實(shí)例變量notifyObservers();呱呱叫時(shí),讓觀察者知道public void registerObserver(Observer observer)public void notifyObservers() 委托給輔助類需要把
24、模式的 Observer 端完成,還需要一些觀察者 Observerpublicerface Observublic void update(QuackObservable duck); Observer 接口只有一個(gè)方法 update(),他需要傳入正在呱呱叫的對(duì)象(QuackObservable)public class Quackologist implements Observerpublic void update(QuackObservable duck)實(shí)現(xiàn)呱呱叫更新模擬器,準(zhǔn)備開始觀察void simulate(AbstractDuckFactory duckFactory)
25、創(chuàng)建鴨子工廠和鴨子,創(chuàng)建群Quackologist quackologist = new Quackologist();創(chuàng)建 Quackologist,把它個(gè)群的觀察者成為一flockOfDucks.registerObserver(quackologist);simulate(flockOfDucks);模擬整個(gè)群運(yùn)行結(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- (2025)專業(yè)技術(shù)人員繼續(xù)教育公需課題庫(kù)(附含答案)
- 痛性周圍神經(jīng)病的診斷和治療共識(shí)(中華神經(jīng)科雜志)
- 二氧化碳性質(zhì)制取
- 中西醫(yī)結(jié)合治療口腔潰瘍的綜合護(hù)理
- 2024高中生期末評(píng)語(yǔ)(35篇)
- QC080000管理手冊(cè)與程序文件
- 2024新版房產(chǎn)開發(fā)掛靠協(xié)議范本版B版
- 2024年超高清視頻內(nèi)容制作與版權(quán)轉(zhuǎn)讓合同
- 2024年甲乙雙方關(guān)于網(wǎng)絡(luò)銷售產(chǎn)品分銷的合同
- 商業(yè)航天產(chǎn)業(yè)園項(xiàng)目運(yùn)營(yíng)方案
- 《農(nóng)產(chǎn)品安全生產(chǎn)》考試復(fù)習(xí)題庫(kù)(學(xué)生用)
- 監(jiān)理安全保證體系
- 野外生存2-1課件
- 謝孟媛中級(jí)文法講義整理版
- 關(guān)于歷史大單元、大概念教學(xué)的討論 課件-高考?xì)v史一輪復(fù)習(xí)
- 旅游者對(duì)鼓浪嶼旅游產(chǎn)品的滿意度調(diào)查問(wèn)卷
- 人教版初二數(shù)學(xué)下冊(cè)《第十七章小結(jié)與復(fù)習(xí)》課件
- 科技水晶質(zhì)感產(chǎn)品推廣PPT模板
- 化工儀表及自動(dòng)化第六版-課后-答案
- 老化箱點(diǎn)檢表A3版本
- 消防設(shè)施驗(yàn)收移交單
評(píng)論
0/150
提交評(píng)論