【正文】
? 迪米特法則 要求一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用。 ? 接口隔離原則 要求客戶端不應(yīng)該依賴那些它不需要的接口,即將一些大的接口細(xì)化成一些小的接口供客戶端使用。 ? 里氏代換原則 可以通俗表述為在軟件中如果能夠使用基類對(duì)象,那么一定能夠使用其子類對(duì)象。 ? 單一職責(zé)原則 要求在軟件系統(tǒng)中,一個(gè)類只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé)。 Page 55 迪米特法則 ? 迪米特法則實(shí)例 ?實(shí)例說(shuō)明 ? 某系統(tǒng)界面類 (如 Form Form2等類 )與數(shù)據(jù)訪問(wèn)類(如 DAO DAO2等類 )之間的調(diào)用關(guān)系較為復(fù)雜 ,如圖所示: Page 56 迪米特法則 ? 迪米特法則實(shí)例 ?實(shí)例解析 Form 1 Form 2 Form 3 Form 4 Form 5DA O1 DA O2 DA O3 DA O4Cont rolle r1 Cont rolle r2Page 57 本章小結(jié) ? 對(duì)于面向?qū)ο蟮能浖到y(tǒng)設(shè)計(jì)來(lái)說(shuō),在支持可維護(hù)性的同時(shí),需要提高系統(tǒng)的可復(fù)用性。一個(gè)系統(tǒng)的規(guī)模越大,信息的隱藏就越重要,而信息隱藏的重要性也就越明顯。 ?廣義的迪米特法則: 指對(duì)對(duì)象之間的信息流量、流向以及信息的影響的控制 ,主要是 對(duì)信息隱藏的控制 。 在狹義的迪米特法則中,如果兩個(gè)類之間不必彼此直接通信 , 那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用 ,如果其中的一個(gè)類需要調(diào)用另一個(gè)類的某一個(gè)方法的話,可以通過(guò) 第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用 。 ?任何一個(gè)對(duì)象,如果滿足上面的條件之一,就是當(dāng)前對(duì)象的“朋友”,否則就是“陌生人”。這樣,當(dāng)一個(gè)模塊修改時(shí),就會(huì)盡量少的影響其他的模塊,擴(kuò)展會(huì)相對(duì)容易,這是對(duì)軟件實(shí)體之間通信的限制,它要求限制軟件實(shí)體之間通信的寬度和深度。 Page 50 迪米特法則 ? 迪米特法則分析 ?迪米特法則來(lái)自于 1987年秋美國(guó)東北大學(xué) (Northeastern University)一個(gè) 名為“ Demeter”的研究項(xiàng)目 。 ? (2) 只與你的直接朋友通信 。 ? 現(xiàn)使用合成復(fù)用原則對(duì)其進(jìn)行重構(gòu)。 Page 46 合成復(fù)用原則 ? 合成復(fù)用原則實(shí)例 ?實(shí)例說(shuō)明 ? 某教學(xué)管理系統(tǒng)部分?jǐn)?shù)據(jù)庫(kù)訪問(wèn)類設(shè)計(jì)如圖所示: D B U til+ g e tC o n n e ct io n ( )...: C o n n e ct io nS tu d e n tD A O+++fin d S tu d e n tB yI d ( S tr in g id )fin d A llS tu d e n ts ( )sa ve ( S tu d e n tD T O s tu d e n t)...: S tu d e n tD T O: L is t: in tT e a ch e rD A O+++fin d T e a ch e rB yI d ( S tr in g id )fin d A llT e a ch e rs ( )sa ve ( T e a ch e rD T O t e a ch e r)...: T e a ch e rD T O: L is t: in tPage 47 合成復(fù)用原則 ? 合成復(fù)用原則實(shí)例 ?實(shí)例說(shuō)明 ? 如果需要更換數(shù)據(jù)庫(kù)連接方式,如原來(lái)采用 JDBC連接數(shù)據(jù)庫(kù),現(xiàn)在采用數(shù)據(jù)庫(kù)連接池連接,則需要修改 DBUtil類源代碼。( “白箱” 復(fù)用 ) ? 組合 /聚合復(fù)用:耦合度相對(duì)較低,選擇性地調(diào)用成員對(duì)象的操作;可以在運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行。 ? 繼承復(fù)用:實(shí)現(xiàn)簡(jiǎn)單,易于擴(kuò)展。簡(jiǎn)言之:要盡量使用組合 /聚合關(guān)系,少用繼承 。 Clie ntAA bst ract Se rvice+++op era torA ()op era torB ()op era torC ()...: void: void: voidClie ntBClie ntCCon cret eS ervic e+++op era torA ()op era torB ()op era torC (): void: void: voidPage 41 接口隔離原則 ? 接口隔離原則實(shí)例 ?實(shí)例解析 Cl ie nt A A bs tra ct Se rvi ce A+ op er at or A ()...: v oi dCl ie nt BCl ie nt CCo nc re te Se rvi ce+++op er at or A ()op er at or B ()op er at or C (): v oi d: v oi d: v oi dA bs tra ct Se rvi ce B+ op er at or B ()...: v oi dA bs tra ct Se rvi ce C+ op er at or C ()...: v oi dPage 42 合成復(fù)用原則 ? 合成復(fù)用原則定義 ?合成復(fù)用原則 (Composite Reuse Principle, CRP)又稱為組合 /聚合復(fù)用原則 (Composition/ Aggregate Reuse Principle, CARP),其定義如下: ? 盡量使用對(duì)象組合 ,而 不是繼承 來(lái)達(dá)到復(fù)用的目的。 Page 40 接口隔離原則 ? 接口隔離原則實(shí)例 ?實(shí)例說(shuō)明 ? 下圖展示了一個(gè)擁有多個(gè)客戶類的系統(tǒng),在系統(tǒng)中定義了一個(gè)巨大的接口 AbstractService來(lái)服務(wù)所有的客戶類。 Page 39 接口隔離原則 ? 接口隔離原則分析 ?使用接口隔離原則拆分接口時(shí),首先必須滿足 單一職責(zé)原則 ,將一組相關(guān)的操作定義在一個(gè)接口中,且在滿足高內(nèi)聚的前提下,接口中的方法越少越好。 ? (1) 一個(gè)接口就 只代表一個(gè)角色 ,每個(gè)角色都有它特定的一個(gè)接口,此時(shí)這個(gè)原則可以叫做“角色隔離原則”。 Page 38 接口隔離原則 ? 接口隔離原則分析 ?接口隔離原則是指使 用多個(gè)專門的接口,而不使用單一的總接口 。 ?注意,在該定義中的接口指的是所定義的方法?,F(xiàn)使用依賴倒轉(zhuǎn)原則對(duì)其進(jìn)行重構(gòu)。 } } Page 34 依賴倒轉(zhuǎn)原則 ? 依賴倒轉(zhuǎn)原則實(shí)例 ?實(shí)例說(shuō)明 ? 某系統(tǒng)提供一個(gè)數(shù)據(jù)轉(zhuǎn)換模塊,可以將來(lái)自不同數(shù)據(jù)源的數(shù)據(jù)轉(zhuǎn)換成多種格式,如可以轉(zhuǎn)換來(lái)自數(shù)據(jù)庫(kù)的數(shù)據(jù)(Database