設(shè)計模式設(shè)計模式七大原則課件_第1頁
設(shè)計模式設(shè)計模式七大原則課件_第2頁
設(shè)計模式設(shè)計模式七大原則課件_第3頁
設(shè)計模式設(shè)計模式七大原則課件_第4頁
設(shè)計模式設(shè)計模式七大原則課件_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

時間反復(fù)無常,鼓著翅膀飛逝設(shè)計模式設(shè)計模式七大原則設(shè)計模式設(shè)計模式七大原則時間反復(fù)無常,鼓著翅膀飛逝設(shè)計模式設(shè)計模式七大原則設(shè)計模式02鄭州大學(xué)軟件學(xué)院趙哲主要內(nèi)容設(shè)計模式準(zhǔn)備:7大設(shè)計原則鄭州大學(xué)軟件學(xué)院趙哲一個例子GameLogin()Exit()Left()Right()Fire()getUserName()getHighScore()鄭州大學(xué)軟件學(xué)院趙哲思考問題這個類中有幾個職責(zé)?用戶是否登陸的方法跟用戶玩游戲的方法是否有關(guān)?獲得用戶信息跟其他兩個職責(zé)是否有關(guān)?如何優(yōu)化代碼?鄭州大學(xué)軟件學(xué)院趙哲優(yōu)化完成UML類圖userStateLogin()Exit()PlayLeft()Right()Fire()userInforgetUserName()getHighScore()內(nèi)聚高還是低?耦合度呢?鄭州大學(xué)軟件學(xué)院趙哲開-閉原則對擴展開放、對更改封閉OpenforextensionClosedformodification開放-封閉原則是面向?qū)ο笤O(shè)計的核心所在做一個例子:寫個代碼片段:完成對兩個數(shù)字的加分和減法鄭州大學(xué)軟件學(xué)院趙哲開-閉原則大部分人的做法:若要添加乘法和除法呢?鄭州大學(xué)軟件學(xué)院趙哲開-閉原則OperaterGetResult(a,b)減GetResult(a,b)加GetResult(a,b)符合開閉原則鄭州大學(xué)軟件學(xué)院趙哲里氏代換原則BarbaraLiskow在1988年發(fā)表的1972年Barbara成為麻省理工學(xué)院的教授是美國獲得計算機科學(xué)博士學(xué)位的第一人12鄭州大學(xué)軟件學(xué)院趙哲里氏代換原則LiskowSubstitutionPrinciple(LSP):子類必須能夠替換掉它們的父類型只要是基類出現(xiàn)的地方,一定能夠出現(xiàn)子類!LSP指導(dǎo)繼承,是繼承的基石龍生龍,鳳生鳳,老鼠的兒子會打洞。13鄭州大學(xué)軟件學(xué)院趙哲LSP例子:一個例子:長方形和正方形某軟件while(長>=寬),將寬+1.父類沒問題,但子類就回出現(xiàn)死循環(huán)正方形不可以繼承長方形14鄭州大學(xué)軟件學(xué)院趙哲LSP例子孫悟空勾掉生死簿中所有猴子的名字,那么獼猴、石猴、長臂猿等的名字是否都勾掉了?乘馬,乘白馬、乘驪馬注意LSP反之不成立!《墨子小取》娣,美人也,愛娣,非愛美人也….盜,人也;惡盜,非惡人也15鄭州大學(xué)軟件學(xué)院趙哲一個例子鄭州大學(xué)軟件學(xué)院趙哲依賴虛線普通箭頭表示依賴依賴和關(guān)聯(lián)的區(qū)別A和B關(guān)聯(lián),A只認(rèn)識B,知道B的屬性和方法,可以雙關(guān)聯(lián),但不建議使用。A依賴BB的改變影響A的結(jié)果。通常依賴是單向的鄭州大學(xué)軟件學(xué)院趙哲×如果父類的某些方法在子類中已經(jīng)發(fā)生畸變,則建議斷開父子關(guān)系!鄭州大學(xué)軟件學(xué)院趙哲鄭州大學(xué)軟件學(xué)院趙哲總結(jié)LSP拒絕子類有自己的個性一旦子類有了“個性”,則與父類之間的關(guān)系難以調(diào)和會讓代碼的耦合變得撲朔迷離鄭州大學(xué)軟件學(xué)院趙哲依賴倒轉(zhuǎn)原則要針對接口編程,不要針對實現(xiàn)編程。Programtoaninterface,notanimplementation.高層模塊不應(yīng)該依賴底層模塊,兩者應(yīng)該都依賴抽象High-levelmoduleshouldnotdependuponbottommodule.bothshoulddependuponabstractions21鄭州大學(xué)軟件學(xué)院趙哲依賴倒轉(zhuǎn)原則減少類之間的耦合度降低風(fēng)險一個例子司機開車Driverdriver(Benzbz)BenzRun()鄭州大學(xué)軟件學(xué)院趙哲依賴倒轉(zhuǎn)原則司機還要開寶馬,如何實現(xiàn)?增加寶馬類,但是需要修改司機類BMWRun()Driverdriver(Benzbz)driver(BMWbmw)BenzRun()×鄭州大學(xué)軟件學(xué)院趙哲如何解決針對接口編程鄭州大學(xué)軟件學(xué)院趙哲實現(xiàn)場景代碼:張三開奔馳IDriver張3=newDriver();ICarbenz=newBenz();張3.driver(benz);鄭州大學(xué)軟件學(xué)院趙哲練習(xí)最初:光明農(nóng)場養(yǎng)牛擴展:多種牛場、喂養(yǎng)多種動物最初類圖如下,按照依賴倒轉(zhuǎn)原則畫出正確類圖光明農(nóng)場Feed(Cowc)Cow鄭州大學(xué)軟件學(xué)院趙哲接口隔離原則InterfaceSegregationPrincipleISP客戶端不應(yīng)該依賴它不需要的方法類間的依賴關(guān)系應(yīng)該建立在最小的接口上鄭州大學(xué)軟件學(xué)院趙哲一個例子一個接口:內(nèi)容是雇傭者有吃飯和做工作的方法雇傭的男、女都可以使用該接口有一天,雇傭者來了一個機器人。機器人不吃飯鄭州大學(xué)軟件學(xué)院趙哲例子-錯誤InterfaceIWorker{ voideat(); voidwork();}ClassWorker:IWorker{ publicvoideat(){//eat相關(guān)代碼} publicvoidwork(){//work相關(guān)代碼}}29鄭州大學(xué)軟件學(xué)院趙哲ISP例子的缺陷胖接口,造成了對接口的污染如何解決?客戶端不應(yīng)該依賴它不需要的方法類間的依賴關(guān)系應(yīng)該建立在最小的接口上一個接口只做一件事30鄭州大學(xué)軟件學(xué)院趙哲例子-符合ISPInterfaceIWorkerEat{voideat();}InterfaceIWorkerWork{voidwork();}ClassWorker:IWorkerEat,IWorkerWork{ publicvoideat(){//eat相關(guān)代碼} publicvoidwork(){//work相關(guān)代碼}}ClassRobot:IWorkerWork{ publicvoidwork(){//work相關(guān)代碼}}面向接口編程,而非實現(xiàn)編程31鄭州大學(xué)軟件學(xué)院趙哲ISP胖接口容易導(dǎo)致啞方法瘦接口更健康!32鄭州大學(xué)軟件學(xué)院趙哲合成/聚合復(fù)用原則Composite/AggregateReusePrincipleCARP合成和聚合合成是強烈的關(guān)聯(lián),部分(將)和整體(主)生命周期一樣,整體(主)對部分(將)有支配權(quán),包括創(chuàng)建和銷毀。聚合是部分和整體的普通關(guān)聯(lián)鄭州大學(xué)軟件學(xué)院趙哲合成和聚合劉邦和韓信34鄭州大學(xué)軟件學(xué)院趙哲CARP原則合成:

classPerson{ privateHandhand; publicPerson() {hand=newHand();} }35鄭州大學(xué)軟件學(xué)院趙哲CARP原則聚合:

classPerson{ privateComputercomputer;privateAa;publicsetComputer(){ computer=newComputer();}publicsetA(){ a=newa();}}36鄭州大學(xué)軟件學(xué)院趙哲CARP原則盡量使用合成/聚合,而不是使用繼承繼承的優(yōu)點新的實現(xiàn)較為容易,因為基類的大部分功能可以通過繼承的關(guān)系自動進入子類。修改和擴展繼承而來的實現(xiàn)較為容易。繼承的缺點繼承將基類的實現(xiàn)細(xì)節(jié)暴露給子類。稱“白箱”復(fù)用。如果基類發(fā)生改變,那么子類的實現(xiàn)也不得不發(fā)生改變。多繼承不利于維護37鄭州大學(xué)軟件學(xué)院趙哲CARP特點優(yōu)點:依賴少,條條框框的限制少幾乎可以用到任何環(huán)境中容易實現(xiàn)修改和擴展容易缺點:對象多,需要管理38鄭州大學(xué)軟件學(xué)院趙哲迪米特原則TheLawofDemeterLoD不要和陌生人說話又叫最少知識原則小國寡民,鄰國相望,雞犬之聲相聞,民至老死,不相往來鄭州大學(xué)軟件學(xué)院趙哲迪米特法則一個對象應(yīng)當(dāng)對其他對象有盡可能少的了解,不和陌生人說話最少知識、不相往來talkonlytoyourimmediatefriends建議多使用Private和Protect,而少使用public40鄭州大學(xué)軟件學(xué)院趙哲迪米特法則41鄭州大學(xué)軟件學(xué)院趙哲迪米特法則的優(yōu)點相當(dāng)弱的類耦合利于復(fù)用只要有可能類就可以設(shè)計成不變類42鄭州大學(xué)軟件學(xué)院趙哲迪米特法則的缺點造成大量的小方法,散落在系統(tǒng)的各個角落這些方法僅僅是傳遞間接的調(diào)用容易引起第一次了解系統(tǒng)人的困惑43鄭州大學(xué)軟件學(xué)院趙哲迪米特法則和設(shè)計模式Fa?ade模式和Mediator模式都符合迪米特法則44鄭州大學(xué)軟件學(xué)院趙哲總結(jié)泛化、依賴、關(guān)聯(lián)、聚合、組合泛化(繼承)classA{}classB:A{}依賴:

classA{

publicvoidFunction(Bb)}classB{}鄭州大學(xué)軟件學(xué)院趙哲關(guān)聯(lián)

classA{

Bb=newB();}classB{}聚合

classA{

Bb=newB();

Cc=newC();}classB{}classC{}鄭州大學(xué)軟件學(xué)院趙哲合成classA{PublicA()

{

Bb=newB();}}classB{}聚合和合成的區(qū)別:生命周期。合成中,隨著A類的生命周期結(jié)束,B也結(jié)束。必須在A類里面使用。聚合中,隨著A類的生命周期結(jié)束,B,C不一定結(jié)束。鄭州大學(xué)軟件學(xué)院趙哲總結(jié)7大原則單一職責(zé)原則開-閉原則里氏代換原則依賴倒轉(zhuǎn)原則

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論