




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第適配器模式和外觀模式第1頁(yè)/共29頁(yè)2面向?qū)ο筮m配器第2頁(yè)/共29頁(yè)3適配鴨子的火雞publicinterfaceDuck{ publicvoidquack(); publicvoidfly();}publicclassMallardDuckimplementsDuck{ publicvoidquack(){ System.out.println("Quack"); } publicvoidfly(){ System.out.println("I'mflying"); }}鴨子接口,具備呱呱叫和飛行能力。綠頭鴨是鴨子的子類。第3頁(yè)/共29頁(yè)4適配鴨子的火雞(續(xù))
publicinterfaceTurkey{ publicvoidgobble(); publicvoidfly();}publicclassWildTurkeyimplementsTurkey{ publicvoidgobble(){ System.out.println("Gobblegobble"); } publicvoidfly(){ System.out.println("I'mflyingashortdistance"); }}火雞不會(huì)呱呱叫,只會(huì)咯咯叫?;痣u也會(huì)飛,雖然飛不遠(yuǎn)?;痣u的一個(gè)具體實(shí)現(xiàn)。第4頁(yè)/共29頁(yè)5火雞適配器
假定缺鴨子對(duì)象,用火雞對(duì)象來(lái)冒充,需要為火雞對(duì)象寫一個(gè)適配器。publicclassTurkeyAdapterimplementsDuck{ Turkeyturkey; publicTurkeyAdapter(Turkeyturkey){ this.turkey=turkey; } publicvoidquack(){ turkey.gobble(); } publicvoidfly(){ for(inti=0;i<5;i++){ turkey.fly(); } }}火雞飛行距離短,連續(xù)5次調(diào)用火雞的fly()方法。構(gòu)造器獲得適配對(duì)象的引用。第5頁(yè)/共29頁(yè)6測(cè)試適配器publicclassDuckTestDrive{publicstaticvoidmain(String[]args){ MallardDuckduck=newMallardDuck(); WildTurkeyturkey=newWildTurkey(); DuckturkeyAdapter=newTurkeyAdapter(turkey);
System.out.println("TheTurkeysays..."); turkey.gobble(); turkey.fly();
System.out.println("\nTheDucksays..."); testDuck(duck);
System.out.println("\nTheTurkeyAdaptersays..."); testDuck(turkeyAdapter);}staticvoidtestDuck(Duckduck){ duck.quack(); duck.fly();}}火雞包裝進(jìn)火雞適配器中,使它看起來(lái)象一只鴨子。測(cè)試火雞。測(cè)試?guó)喿印y(cè)試適配器:傳入一個(gè)假裝鴨子的火雞。第6頁(yè)/共29頁(yè)7測(cè)試結(jié)果火雞咯咯叫,且飛行距離短。鴨子呱呱叫,并能飛行。Quack()被調(diào)用時(shí),適配器咯咯叫;fly()被調(diào)用時(shí),適配器飛行了5次。testDuck()方法根本不知道,這其實(shí)是一只假裝成鴨子的火雞。第7頁(yè)/共29頁(yè)8適配器模式分析第8頁(yè)/共29頁(yè)9客戶使用適配器過(guò)程①客戶通過(guò)目標(biāo)接口調(diào)用適配器的方法對(duì)適配器發(fā)出請(qǐng)求。②適配器使用被適配者接口把請(qǐng)求轉(zhuǎn)換成被適配者的一個(gè)或多個(gè)調(diào)用接口。③客戶收到調(diào)用結(jié)果,但并未察覺(jué)這一切是適配器在起轉(zhuǎn)換作用。客戶和被適配者是解耦的。第9頁(yè)/共29頁(yè)10適配器模式定義類圖第10頁(yè)/共29頁(yè)11對(duì)象和類適配器有兩種適配器:對(duì)象適配器和類適配器。前一頁(yè)是對(duì)象適配器類圖,類適配器類圖如下:對(duì)象適配器可適配某個(gè)類及其子類。但是,需要實(shí)現(xiàn)被適配者,多一個(gè)對(duì)象,效率低點(diǎn)。第11頁(yè)/共29頁(yè)12家庭影院爆米花機(jī)放大器
調(diào)諧器第12頁(yè)/共29頁(yè)13觀賞電影⑴打開(kāi)爆米花機(jī)⑵開(kāi)始爆米花⑶燈光調(diào)暗⑷放下屏幕⑸打開(kāi)投影機(jī)⑹將投影機(jī)的輸入切換到DVD⑺
將投影機(jī)切換到寬屏方式⑻打開(kāi)功放⑼將功放輸入設(shè)置為DVD⑽
將功放設(shè)置為環(huán)繞立體聲⑾將功放音量調(diào)到中(5)⑿打開(kāi)DVD播放器⒀開(kāi)始播放DVD看完還得一個(gè)個(gè)關(guān)掉!第13頁(yè)/共29頁(yè)14開(kāi)機(jī)任務(wù)寫成類和方法調(diào)用
popper.on(); popper.pop(); lights.dim(10);//燈光調(diào)暗
screen.down();//放下屏幕
projector.on(); projector.setInput(dvd); projector.wideScreenMode(); amp.on(); amp.setDvd(dvd); amp.setSurroundSound(); amp.setVolume(5); dvd.on(); dvd.play(movie);打開(kāi)爆米花機(jī),開(kāi)始爆米花打開(kāi)投影機(jī),設(shè)置為DVD和寬屏模式…打開(kāi)功放,設(shè)置為DVD,調(diào)整成環(huán)繞立體聲模式,音量調(diào)到5…打開(kāi)DVD播放機(jī)。第14頁(yè)/共29頁(yè)15簡(jiǎn)化外觀watchMovie()第15頁(yè)/共29頁(yè)16簡(jiǎn)化外觀(續(xù))第16頁(yè)/共29頁(yè)17構(gòu)造家庭影院的外觀
publicclassHomeTheaterFacade{ Amplifieramp; Tunertuner; DvdPlayerdvd; CdPlayercd; Projectorprojector; TheaterLightslights; Screenscreen; PopcornPopperpopper;組合:子系統(tǒng)組件都在這里。第17頁(yè)/共29頁(yè)18構(gòu)造家庭影院的外觀 publicHomeTheaterFacade(Amplifieramp,
//構(gòu)造方法 Tunertuner, DvdPlayerdvd, CdPlayercd, Projectorprojector, Screenscreen, TheaterLightslights, PopcornPopperpopper){
this.amp=amp; this.tuner=tuner; this.dvd=dvd; this.cd=cd; jector=projector; this.screen=screen; this.lights=lights; this.popper=popper; }
//其它方法}外觀子系統(tǒng)中每一個(gè)組件的引用都傳入它的構(gòu)造器中。然后,外觀把它們賦值給相應(yīng)的實(shí)例變量。第18頁(yè)/共29頁(yè)19實(shí)現(xiàn)簡(jiǎn)化的接口
publicvoidwatchMovie(Stringmovie){ System.out.println("Getreadytowatchamovie..."); popper.on(); popper.pop(); lights.dim(10); screen.down(); projector.on(); projector.wideScreenMode(); amp.on(); amp.setDvd(dvd); amp.setSurroundSound(); amp.setVolume(5); dvd.on(); dvd.play(movie); }將以前手動(dòng)任務(wù)依次處理。每項(xiàng)任務(wù)都是委托子系統(tǒng)中相應(yīng)的組件處理。第19頁(yè)/共29頁(yè)20實(shí)現(xiàn)簡(jiǎn)化的接口(續(xù)) publicvoidendMovie(){ System.out.println("Shuttingmovietheaterdown..."); popper.off(); lights.on(); screen.up(); projector.off(); amp.off(); dvd.stop(); dvd.eject(); dvd.off(); }負(fù)責(zé)關(guān)閉一切。每項(xiàng)任務(wù)也都是委托子系統(tǒng)中相應(yīng)的組件處理。第20頁(yè)/共29頁(yè)21觀賞電影(輕松的方式)publicclassHomeTheaterTestDrive{ publicstaticvoidmain(String[]args){
//實(shí)例化組件
HomeTheaterFacadehomeTheater= newHomeTheaterFacade(amp,tuner,dvd,cd, projector,screen,lights,popper);
homeTheater.watchMovie("RaidersoftheLostArk"); homeTheater.endMovie();}}根據(jù)子系統(tǒng)所有組件實(shí)例化外觀。使用簡(jiǎn)化的接口,首先開(kāi)啟電影,然后關(guān)閉電影。第21頁(yè)/共29頁(yè)22輸出結(jié)果調(diào)用外觀的watchMovie(),一切都打開(kāi)。調(diào)用外觀的endMovie(),一切都關(guān)閉。第22頁(yè)/共29頁(yè)23外觀模式定義類圖第23頁(yè)/共29頁(yè)24“最少知識(shí)”原則這個(gè)原則希望我們?cè)谠O(shè)計(jì)中,不要讓太多的類耦合在一起,免得修改系統(tǒng)中的一部分,會(huì)影響到其它的部分。如果許多類之間相互依賴,系統(tǒng)就易碎,維護(hù)成本會(huì)上升,也不易理解。第24頁(yè)/共29頁(yè)25怎樣才不會(huì)交太多的朋友,影響太多的對(duì)象 就任何對(duì)象而言,在該對(duì)象的方法內(nèi),應(yīng)該調(diào)用屬于以下范圍的方法:該對(duì)象本身被當(dāng)作參數(shù)傳遞進(jìn)的對(duì)象此方法所創(chuàng)建或?qū)嵗娜魏螌?duì)象對(duì)象的任何組件暗示:不要調(diào)用方法返回對(duì)象的方法。第25頁(yè)/共29頁(yè)26怎樣才不會(huì)交太多的朋友,影響太多的對(duì)象(續(xù))publicfloatgetTemp(){ Thermometerthermometer=station.getThermometer(); returnthermometer.getTemperature();}publicfloatgetTemp(){ returnstation.getTemperature();}未采用最小知識(shí)原則:從氣象站取得溫度計(jì)對(duì)象,然后從溫度計(jì)對(duì)象取得溫度。采用了最小知識(shí)原則:氣象站中增加了一個(gè)向溫度計(jì)請(qǐng)求溫度的方法。溫度計(jì)第26頁(yè)/共29頁(yè)27將方法調(diào)用保持在界限內(nèi)…publicclassCar{ Engineengine;組件的方法可以調(diào)用
//其它實(shí)例方法
publicCar{//初始化發(fā)動(dòng)機(jī)} publicvoidstart(Keykey){ Doorsdoors=newDoors(); booleanauthorized=key.turns(); if
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二年級(jí)上冊(cè)數(shù)學(xué)教案-練習(xí)七-北師大版
- 六年級(jí)上冊(cè)數(shù)學(xué)教案-3.1 倒-數(shù) |西師大版
- 六年級(jí)下冊(cè)數(shù)學(xué)教案-4.1扇形統(tǒng)計(jì)圖的認(rèn)識(shí) ︳西師大版
- 三年級(jí)上冊(cè)數(shù)學(xué)教案-解決問(wèn)題第一課時(shí)|蘇教版
- 六年級(jí)上冊(cè)數(shù)學(xué)教案 -2.1 分?jǐn)?shù)混合運(yùn)算|北師大版
- 融資擔(dān)保培訓(xùn)協(xié)議書(shū)(2篇)
- 北師大版數(shù)學(xué)三年級(jí)上冊(cè)單元測(cè)試卷-第三單元-加與減(含答案)
- 2024年血壓調(diào)節(jié)用品項(xiàng)目資金籌措計(jì)劃書(shū)代可行性研究報(bào)告
- 2025年度兩人共同投資可再生能源項(xiàng)目的股份合作合同
- 2025年度合伙人退出與合作伙伴關(guān)系維護(hù)協(xié)議
- 生涯規(guī)劃與就業(yè)創(chuàng)業(yè)全套課件電子教案板
- 湘少版六年級(jí)英語(yǔ)下冊(cè)《全冊(cè)課件》
- 2024-2030年中國(guó)護(hù)眼臺(tái)燈行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 《土壤肥料學(xué)通論》課程教學(xué)大綱
- 第十四屆全國(guó)交通運(yùn)輸行業(yè)職業(yè)技能競(jìng)賽(公路收費(fèi)及監(jiān)控員)賽項(xiàng)題庫(kù)-下(多選題-共3部分-2)
- 集合功能的測(cè)定(雙眼視檢查)
- 2024年農(nóng)村自建房裝修合同
- 2024年《高等教育心理學(xué)》考前輔導(dǎo)必背習(xí)題庫(kù)(300題)
- 2024年江蘇農(nóng)牧科技職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)完美版
- 2024年廣西職業(yè)院校技能大賽中職組《智慧物流作業(yè)》模塊MC競(jìng)賽樣題
- 人事專員簡(jiǎn)歷模板
評(píng)論
0/150
提交評(píng)論