【正文】
? 迪米特法則要求一個軟件實體應(yīng)當(dāng)盡可能少的與其他實體發(fā)生相互作用。 ? 接口隔離原則要求客戶端不應(yīng)該依賴那些它不需要的接口,即將一些大的接口細化成一些小的接口供客戶端使用。 ? 里氏代換原則可以通俗表述為在軟件中如果能夠使用基類對象,那么一定能夠使用其子類對象。 ? 單一職責(zé)原則要求在軟件系統(tǒng)中,一個類只負責(zé)一個功能領(lǐng)域中的相應(yīng)職責(zé)。 迪米特法則 ?迪米特法則實例 ?實例說明 ? 某系統(tǒng)界面類 (如 Form Form2等類 )與數(shù)據(jù)訪問類 (如 DAODAO2等類 )之間的調(diào)用關(guān)系較為復(fù)雜 , 如圖所示: 迪米特法則 ?迪米特法則實例 ?實例解析 Form 1 Form 2 Form 3 Form 4 Form 5DA O1 DA O2 DA O3 DA O4Cont rolle r1 Cont rolle r2小結(jié) ? 對于面向?qū)ο蟮能浖到y(tǒng)設(shè)計來說,在支持可維護性的同時,需要提高系統(tǒng)的可復(fù)用性。一個系統(tǒng)的規(guī)模越大,信息的隱藏就越重要,而信息隱藏的重要性也就越明顯。 ? 廣義的迪米特法則: 指對對象之間的信息流量、流向以及信息的影響的控制 ,主要是 對信息隱藏的控制 。 在狹義的迪米特法則中,如果兩個類之間不必彼此直接通信 , 那么這兩個類就不應(yīng)當(dāng)發(fā)生直接的相互作用 ,如果其中的一個類需要調(diào)用另一個類的某一個方法的話,可以通過 第三者轉(zhuǎn)發(fā)這個調(diào)用 。 ? 任何一個對象,如果滿足上面的條件之一,就是當(dāng)前對象的“朋友”,否則就是“陌生人”。這樣,當(dāng)一個模塊修改時,就會盡量少的影響其他的模塊,擴展會相對容易,這是對軟件實體之間通信的限制,它要求限制軟件實體之間通信的寬度和深度。 英文定義為: Each unit should have only limited knowledge about other units: only units closely related to the current unit. 迪米特法則 ?迪米特法則分析 ?迪米特法則來自于 1987年秋美國東北大學(xué)(Northeastern University)一個 名為“ Demeter”的研究項目 。t talk to strangers. ? (2) 只與你的直接朋友通信 。 合成復(fù)用原則 ?合成復(fù)用原則實例 ?實例解析 DB Ut il+ ge tC on ne ct io n ()...: C on ne ct io nSt ud en tD A O dB O pe ra to r : D BU til++++se tD BO pe ra to r ( DB Ut il d BO pe ra to r)fin dS tu de nt By I d (S trin g id )fin dA llS tu de nt s ()sa ve (S tu de nt DT O s tu de nt )...: v oi d: S tu de nt DT O: L ist: i ntT ea ch er DA O dB O pe ra to r : D BU til++++se tD BO pe ra to r ( DB Ut il d BO pe ra to r)fin dT ea ch er By I d (S trin g id )fin dA llT ea ch er s ()sa ve (T ea ch er DT O te ac he r)...: v oi d: T ea ch er DT O: L ist: i ntNe wD BU til+ ge tC on ne ct io n ()...: C on ne ct io n迪米特法則 ? 迪米特法則定義 ? 迪米特法則 (Law of Demeter, LoD)又稱為最少知識原則 (Least Knowledge Principle, LKP),它有多種定義方法,其中幾種典型定義如下: ? (1) 不要和“陌生人”說話 。如果 StudentDAO采用 JDBC連接,但是 TeacherDAO采用連接池連接,則需要增加一個新的 DBUtil類,并修改 StudentDAO或TeacherDAO的源代碼,使之繼承新的數(shù)據(jù)庫連接類,這將違背開閉原則,系統(tǒng)擴展性較差。( “黑箱” 復(fù)用 ) 合成復(fù)用原則 ?合成復(fù)用原則分析 ?組合 /聚合可以 使系統(tǒng)更加靈活 , 類與類之間的 耦合度降低 , 一個類的變化對其他類造成的影響相對較少 ,因此一般 首選使用組合 /聚合來實現(xiàn)復(fù)用 ;其次才考慮繼承 , 在使用繼承時 , 需要嚴(yán)格遵循里氏代換原則 ,有效使用繼承會有助于對問題的理解 , 降低復(fù)雜度 ,而濫用繼承反而會增加系統(tǒng)構(gòu)建和維護的難度以及系統(tǒng)的復(fù)雜度 , 因此需要 慎重使用繼承復(fù)用 。破壞系統(tǒng)的封裝性;從基類繼承而來的實現(xiàn)是靜態(tài)的,不可能在運行時發(fā)生改變,沒有足夠的靈活性;只能在有限的環(huán)境中使用。 合成復(fù)用原則 ?合成復(fù)用原則分析 ?在面向?qū)ο笤O(shè)計中,可以通過兩種基本方法在不同的環(huán)境中復(fù)用已有的設(shè)計和實現(xiàn),即通過 組合 /聚合關(guān)系或通過 繼承 。 ? 其英文定義為: ? Favor position of objects over inheritance as a reuse mechanism. 合成復(fù)用原則 ?合成復(fù)用原則分析 ?合成復(fù)用原則就是指在一個新的對象里通過 關(guān)聯(lián)關(guān)系(包括組合關(guān)系和聚合關(guān)系) 來使用一些已有的對象,使之成為新對象的一部分;新對象 通過委派調(diào)用已有對象的方法達到復(fù)用其已有功能的目的 ??梢允褂媒涌诟綦x原則對其進行重構(gòu)。如果針對客戶 A的方法發(fā)生改變,客戶 B和客戶 C并不會受到任何影響,也不需要進行再次編譯和重新發(fā)布。這是一種不幸的做法。只要針對客戶 A的方法發(fā)生改變,客戶 B和客戶 C就會受到影響。 接口隔離原則 ? 下圖展示了一個擁有多個客戶的類。 接口隔離原則 ?接口隔離原則分析 ?使用接口隔離原則拆分接口時,首先必須滿足 單一職責(zé)原則 ,將一組相關(guān)的操作定義在一個接口中,且在滿足高內(nèi)聚的前提下,接口中的方法越少越好。 ? (1) 一個接口就 只代表一個角色 ,每個角色都有它特定的一個接口,此時這個原則可以叫做“角色隔離原則”。 it needs to b