《java與模式》讀書筆記 ----模式設計的原則
來源:互聯網
上載者:User
筆記|設計
裡氏代換原則----LSP
概念:一個軟體實體如果使用一個父類的話,那麼一定適用於其之類,而且不能覺察出父類和子類的區別。
裡氏代換原則是繼承複用的基石。只有當衍生類可以替換掉基類,軟體單位不會受到影響時,基礎類才真正被複用,而衍生類才能在基礎類上增加新的行為。
JAVA中的上塑造型既是裡氏代換原則的體現。
依賴倒轉原則-----DIP
狹義依賴關係。
依賴關係(Dependency)類與類之間的一種串連,依賴總是單向的。一各類依賴於另一各類的定義。一個人(Person)可以買車(Car)和房子(House),Person類依賴於Car類和House類。
一般而言依賴關係在Java中體現為局部變數、方法參數以及對靜態方法的調用。換言之,一個類A的某一個局部變數的類型是另一個類B,那麼A類就依賴於B類;如果一個方法的參數是另一個類B的執行個體,那麼這個類A就依賴於B類;如果A類調用B類的靜態方法,那麼A類依賴於B類。
廣義的三種依賴關係。這裡依賴又稱耦合
l 零耦合關係(Nil Coupling)。兩個類沒有耦合關係。
l 具體耦合關係(Concrete Coupling)。具體性的耦合關係發生在兩個具體類(可執行個體化的)之間,經由一各類對另一個類直接應用造成。
l 抽象耦合關係(Abstract Coupling)。抽象耦合關係發生在一個具體類和一個抽象類別(或介面)之間,使兩個必鬚髮生關係的的類之間存在最大的靈活性。
依賴倒轉原則含義:抽象不應當依賴於細節,細節應當依賴與抽象。
依賴倒轉原則要求:要針對介面編程,不要針對實現編程。
針對介面編程的意思是說:應當使用java介面和抽象類別進行變數類型的聲明、參數類型的聲明、傳回型別的聲明、資料類型的轉換等。
要保證這一點:一個具體類應當只實現介面和抽象類別中聲明的方法,而不應當給出多餘的方法。
List employees = new Vector();
其中: List 稱變數employees的靜態類型。
Vector稱變數employees的實際類型。
在很多情況下,一個java程式需要引用一個對象。這個時候,如果這個對象又一個抽象類別型的話,應當使用這個對象的抽象類別型作為變數的靜態類型。------這就是針對介面編程的具體含義。
介面隔離原則----------ISP
含義:使用多個專門的介面要比使用單一的總介面要好!
從客戶類角度上看:一個類對另外一個類的依賴性應當是建立在最小的介面之上。
介面的劃分直接帶來類型的劃分。
目標就是不向客戶類提供不必要的行為。
合成彙總複用原則--------CARP
關聯,彙總、合成。
合成和彙總都是關聯的特殊種類。彙總表示“擁有”關係或整體與部分的關係;而合成則是用來表示一種強的多的 “擁有”。在一個合成的關係裡,部分和整體的生命週期是一樣的。一個合成的新的對象完全用又對其他組成部分的支配權。包括他們的建立和湮滅。組合而成的對象對組成部分的記憶體配置、記憶體釋放有絕對的責任。
進一步講。一個合成的多重性不能超過1,換言之,一個合成的關係中,部分對象不能於另一個合成關聯性物件共用。
合成通常理解為:值的彙總。而彙總則是:引用的彙總。
合成和彙總是將已有的對象納入到新的對象中,使之成為新對象的一部分,因此新的對象可以調用已由對象的功能。達到複用的目的。
優點:
l 新對象存取成分對象的唯一方法是通過成分對象的介面。
l 這種複用是黑箱複用,隱藏了成分對象的內部細節。
l 這種複用支援封裝。
l 這種複用依賴性較小。(耦合度低)
l 每一個新類可以將焦點集中在一個任務上。
l 這種複用可以在運行時動態進行。新對象可以動態引用於成分物件類型的子物件。
缺點就是:
通過這種複用建造的系統通常會有較多的對象需要管理。
“合成彙總複用可以替代繼承複用完成任一項功能。”
儘管繼承是一種非常重要的手段但是,應當首先考慮合成彙總。
迪米特法則------LoD
又叫最少知識原則:一個對象應當對其他對象儘可能少的理解。
幾種表述:
l 至於你直接的朋友們通訊。
l 不要跟“陌生人”說話。
l 每一個軟體單位對其他單位用有儘可能少的知識,而且局限於那些於本單位密切相關的軟體單位。
關於“朋友”的約定:
l 當前對象本身(THIS)。
l 以參數形式傳入到當前對象方法中的對象。
l 當前對象的執行個體變數直接引用的對象。
l 當前對象的執行個體變數如果是個聚集那麼聚集中的元素也是“朋友”。
l 當前對象建立的對象。
廣義迪米特法則
軟體系統中,一個模組設計的好不好最主要、最重要的標誌,就是該模組在多大程度上將自己的內部資料和其他實現細節隱藏起來。一個設計好的模組可以將它所有的實現細節隱藏起來,很徹底的將提供給外界的API和自己的實現分離開來。這樣一來模組於模組之間的通訊僅僅通過彼此的API,而不理會模組內部的工作細節。這便是:“資訊的隱藏”—“封裝”。
廣義迪米特法則要求:
l 在類的劃分上,應當建立弱耦合的類。類之間的耦合性越低,越有利於複用。
l 在類的設計結構上,每一個類都應儘可能的降低成員的存取權限。
l 在類的設計上,只要有可能一個類應當設計成不變類。(final)。
l 在對其他類的引用上,各對象對其他對象的引用應降到最低。