深入淺出設(shè)計(jì)模式之策略模式_第1頁
深入淺出設(shè)計(jì)模式之策略模式_第2頁
深入淺出設(shè)計(jì)模式之策略模式_第3頁
深入淺出設(shè)計(jì)模式之策略模式_第4頁
深入淺出設(shè)計(jì)模式之策略模式_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

設(shè)計(jì)方式的入門戰(zhàn)略方式本章的學(xué)習(xí)要點(diǎn)了解設(shè)計(jì)方式的用途和優(yōu)點(diǎn)掌握設(shè)計(jì)OO的根本原那么了解本章所舉的實(shí)例開發(fā)實(shí)例實(shí)例描畫:我們要開發(fā)一個(gè)游戲鴨子,可以戲水,可以鳴叫。而且,在游戲中能夠出現(xiàn)很多各種各樣的鴨子。設(shè)計(jì):將設(shè)置一個(gè)鴨子超類,處理一切鴨子的共有操作,如游泳,鳴叫等,子類實(shí)現(xiàn)本人特殊的操作。超類,實(shí)現(xiàn)共有的東西,將有特征的東西設(shè)為籠統(tǒng)方法綠頭鴨紅頭鴨添加方法假設(shè)需求給鴨子添加飛的方法,根據(jù)OO帶來的問題超類添加一種方法,必然給一切的子類帶來同樣的方法。上述的例子,就是一切的鴨子都可以飛。如何處理這個(gè)問題:我們可以采用子類方法覆蓋的方法,如橡皮鴨子不會(huì)飛,覆蓋橡皮鴨子飛的方法。分析上面我們采用承繼的來處理程序的開放性和可擴(kuò)展性,遇到了問題,為什么會(huì)這樣?由于超類作為一切類的父類,擁有一切子類的共性,但未來會(huì)出現(xiàn)什么子類,無從得知,因此,無法確定哪些是共性方法和共性屬性。承繼承繼本是為了代碼的復(fù)用,節(jié)省子類的代碼。但由于未來的不確定性,無法預(yù)知子類的多少?承繼必需有父類和子類,確定父類的屬性和方法很關(guān)鍵。承繼的問題代碼在多個(gè)子類出現(xiàn)不用要的反復(fù)無法事先預(yù)知一切的子類的一切行為改動(dòng)父類,會(huì)同時(shí)改動(dòng)子類。采用接口接口在Java中是一個(gè)非常重要的概念Java不支持多承繼,但一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。采用接口覆蓋鴨子飛和叫的方法,每一個(gè)會(huì)飛的或會(huì)叫的子類實(shí)現(xiàn)接口。接口帶來的問題接口可以讓每一個(gè)子類本人實(shí)現(xiàn)有特征的方法。子類的代碼無法重用,每一個(gè)子類都實(shí)現(xiàn)接口,即使子類的行為完全一致,也必需各自實(shí)現(xiàn)。軟件編寫盡量少修正遇到新情況,希望不修正程序或少修正程序。程序必需順應(yīng)變化,而本身需求穩(wěn)定。最不變的就是變化需求改動(dòng)平臺(tái)改動(dòng)數(shù)據(jù)改動(dòng)程序設(shè)計(jì)原那么找出運(yùn)用中能夠需求變化之處,將其獨(dú)立出來,把它們和無需變化的代碼分割開,分而治之。當(dāng)需求改動(dòng)時(shí),代碼需求改動(dòng),這部分是可變的,從而區(qū)分出那些是需求改動(dòng)的,哪些是穩(wěn)定的代碼。上面的例子中,duck類中,fly(),quack()方法會(huì)隨著duck的不同而改動(dòng),因此提取出來duckflyquack我們將duck的fly行為和quack行為分別設(shè)計(jì)一個(gè)類。設(shè)計(jì)原那么針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程。我們利用接口代表每一個(gè)行為,如FlyBehaviorQuackBehaviorDuck類不實(shí)現(xiàn)這個(gè)接口,而是由我們?cè)O(shè)立的行為類來實(shí)現(xiàn)。<<interface>>FlyBehaviorfly()FlyWithWingsfly(){…}FlyNoWayfly(){nothing}設(shè)計(jì)新的類時(shí),子類運(yùn)用接口所表示的行為,實(shí)如今行為類中,而不在子類中。接口可以實(shí)現(xiàn)多態(tài)在聲明對(duì)象變量時(shí),最好用超類型。AnimalmakeSound()DogmakeSound〔〕{bark();}Bark(){汪汪叫』CatmakeSound(){meow();}meow(){喵喵叫』Dogd=newDog()d.bark();Animalanimal=newDog();animal.makeSound();a=getAnimal();a.makeSound();實(shí)現(xiàn)鴨子的飛行行為<<interface>>FlyBehaviorfly()FlyWithWingsfly(){…}FlyNoWayfly(){nothing}實(shí)現(xiàn)鴨子的鳴叫行為<<interface>>QuackBehaviorquack()Quackquack(){普通鴨子叫}MuteQuackquack(){nothing}Squackquack(){橡皮鴨子叫}上述的設(shè)計(jì),讓鳴叫,飛行等行為曾經(jīng)與duck類無關(guān)了,我們添加duck類的行為,不會(huì)影響到鳴叫,飛行等行為留意的問題剛開場(chǎng)設(shè)計(jì)程序時(shí),能夠不會(huì)完全預(yù)測(cè)未來的情況,因此,應(yīng)該使程序堅(jiān)持足夠的彈性,以應(yīng)付未來的能夠的變化。事先思索的面面俱到是不能夠的。飛行,鳴叫等的動(dòng)作行為成為一個(gè)類是可以的。思索題假設(shè)如今有了一種新的玩具duck,它采用螺旋漿飛行,該如何處置。什么類還會(huì)用到FlywithWings設(shè)計(jì)思想的實(shí)現(xiàn)根據(jù)前面我們的設(shè)計(jì),我們來實(shí)現(xiàn)duck類DuckFlyBehaviorflyBehaviorQuackBehaviorquackBehaviorperformQuack()Swim()Display()performFlay()publicclassDuck{QuackBehaviorquackBehavior;publicvoidperformQuack(){quackBehavior.quack();}子類的詳細(xì)實(shí)現(xiàn)publicclassMallardDuckextendsDuck{publicMallardDuck(){quackBehavior=newQuack();flyBehavior=newFlyWithWings();}publicvoiddisplay(){System.out.pringln(“〞);}}動(dòng)態(tài)設(shè)定行為Duck類中參與兩個(gè)新方法:publicvoidSetFlyBehavior(FlyBehaviorfb){flyBehavior=fb;}publicvoidSetQuackBehavior(QuackBehaviorqb){quackBehavior=qb;}產(chǎn)生一個(gè)模型鴨publicclassModelDuckextendsDuck{publicModelDuck(){ quackBehavior=newQuack(); flyBehavior=newFlyNoWay();}publicvoiddisplay(){ System.out.println("Iamamodelduck");}}產(chǎn)生一個(gè)新的飛行類publicclassFlyRocketPoweredimplementsFlyBehavior{publicvoidfly(){System.out.println(“Iamflyingwithrocket〞);}動(dòng)態(tài)改動(dòng)行為Duckmodel=newModelDuck();model.performFly();model.setFlyBehavior(newFlyRocketPowered());Model.performFly();封裝行為DuckFlyBehaviorflyBehaviorQuackBehaviorquackBehaviorSwim()Display()performFly()performBehavior()..封裝了飛行行為封裝了鳴叫行為組合和承繼承繼是isa關(guān)系組合是hasa關(guān)系設(shè)計(jì)原那么,多用組合,少用承繼承繼的優(yōu)點(diǎn)是代碼的復(fù)用,節(jié)省初次開發(fā)的時(shí)間。但添加了后期維護(hù)的費(fèi)用。沒有哪一個(gè)軟件開發(fā)完成后,就一成不變的。后期的維護(hù)所破費(fèi)的時(shí)間遠(yuǎn)遠(yuǎn)大于前期開發(fā)的時(shí)間。戰(zhàn)略方式定義了算法簇,分別封裝起來,讓它們之間可以相互交換,讓算法的變化獨(dú)立于算法的的運(yùn)用者。思索迷題p25設(shè)計(jì)方式的運(yùn)用每一個(gè)行業(yè)都有本人的行話,軟件設(shè)計(jì)也不例外。采用行話可以節(jié)省很多時(shí)間,行話的信息量大在軟件行業(yè),設(shè)計(jì)所采用的各種方式就是設(shè)計(jì)者之間的行話。運(yùn)用共享方式的益處減少溝通的信息量站的層次較高不易產(chǎn)生誤解有利于剛參與任務(wù)人的提高設(shè)計(jì)方式的運(yùn)用設(shè)計(jì)方式的運(yùn)用首先在于設(shè)計(jì)者采用設(shè)計(jì)方式來對(duì)軟件進(jìn)展分析設(shè)計(jì)。設(shè)計(jì)方式在于如何組織每一個(gè)類及類之間的關(guān)系。等級(jí)高于庫和框架。因該說庫和框架也運(yùn)用了某種設(shè)計(jì)方式。沒有關(guān)于設(shè)計(jì)方式的庫。設(shè)計(jì)方式和OO原那么的聯(lián)絡(luò)和區(qū)別了解和掌握OO原那么并不能設(shè)計(jì)出高質(zhì)量,開放性好的優(yōu)質(zhì)軟件。設(shè)計(jì)方式在于可以更好的運(yùn)用OO原那么,設(shè)計(jì)出順應(yīng)變化的軟件。設(shè)計(jì)是一門藝術(shù),取舍很重要,不同人即使運(yùn)用一樣的設(shè)計(jì)方式,也不一定設(shè)計(jì)的軟件一樣。設(shè)計(jì)時(shí)一定要思索未來的變化,千萬不要寫死。OO根底籠統(tǒng)封裝多態(tài)承繼OO方式 戰(zhàn)略方式:定義一組算法簇,分別封裝起來,可以相互交換,讓算法的變化獨(dú)立于運(yùn)用者OO原那

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論