設計模式 物件導向設計原則

2021-10-09 12:29:20 字數 2933 閱讀 6935

軟體的可維護性可複製性是兩個非常重要的軟體質量屬性

物件導向物件設計原則是設計模式學習的基礎。每乙個設計模式都符合乙個或者多個物件導向設計原則

單一職責原則是最簡單的物件導向設計原則,它用於控制類的粒度大小

單一設計原則:乙個物件應該只包含單一的職責,並且該職責被完整的封裝在乙個類裡

這也意味著:就乙個類而言,應該僅有乙個引起他變化的原因

因為乙個類承擔的職責越多,他被復用的可能性就越低,同時也相當於將這些職責耦合在一起,其中乙個職責變化時都可能影響到其他職責的運作,因此要將這些職責進行分離。

單一職責原則就是實現高內聚,低耦合的指導方針

開閉原則是物件導向的可復用設計的第一塊基石

開閉原則:軟體實體應當對對擴充套件開放,對修改方便

開閉原則是指軟體實體應盡量在不修改原有**的情況下進行拓展

任何乙個軟體都需要面對乙個非常重要的問題,就是他們的需求是會隨著時間的推移而發生變化的。當軟體系統需要面對新的需求的時候應該盡量保證系統的設計框架是穩定的,如果乙個軟體符合開閉原則,則可以非常方便地對系統進行拓展,而且無需修改原有的**,使得軟體系統在擁有適應性和靈活性的通知具有比較好的穩定性和延續修

為了滿足開閉原則,需要對系統進行抽象化設計,抽象化是開閉原則的關鍵

黎克特制代換原則:所有積累的抵港必須能透明地試使用其子類的物件

在軟體中將乙個基類物件替換成它的子類物件,程式將不會產生任何的錯誤和異常。反過來就不成立,就如同我喜歡動物,那我一定喜歡狗;我喜歡狗,並不代表我喜歡所有動物。

黎克特制代換原則時實現開閉原則的重要方式之一,由於在使用基類物件的地方都可以使用子類物件,因此在程式中盡量使用基類型別來對物件進行定義,而在執行時再確定其子類型別,用子類物件來替換父類物件。

在運用黎克特制代換原則應該盡量將父類設計為抽象類或者介面,讓子類繼承父類或者實現父介面,並且是現在父類中宣告的方法,在執行時子類例項替換父類例項,可以很方便地拓展系統功能,無需修改原有子類中的單嗎,增加新功能可以通過增加乙個新的子類來實現。

依賴倒轉原則:高層模組不應該以來底層木塊,他們都應該依賴抽象。抽象不應該依賴於細節,細節應該依賴於抽象

依賴倒轉原則要求針對介面程式設計,不要針對實現程式設計(program to an inte***ce, on an implementation)。依賴倒轉原則要求在程式中傳遞引數時或者在關聯關係中盡量引用高層次的抽象層類。乙個具體類應該只實現介面或者抽象類中宣告過的方法,而不要給出多餘的方法,否則將會無法呼叫在子類中增加的新方法。

程式應該盡量只在抽象層中程式設計,因為這樣如果系統行為發生變化,只需要對抽象層進行擴充套件,並且修改配置檔案,而不需要修改原有系統源**,在不修改的情況下擴充套件系統功能。

介面隔離原則:客戶端不應該依賴那些它不需要的介面

根據介面隔離原則,當乙個介面太大的時候需要把它分割為一些更細小的介面,使得使用該介面的客戶端只需要知道與之相關的方法即可。

1.如果把介面理解為乙個型別所提供的所有方法特徵的合輯的時候,介面的劃分會直接帶來型別的劃分。乙個介面只能代表乙個角色,每個角色有它特定的乙個介面,此時這個原則又稱角色隔離原則

2.如果把介面理解成狹義的特定語言的介面。介面隔離原則表示的則是介面僅僅提供客戶端所需要的行為,客戶端不需要的行為則隱藏起來,應該給客戶端提供盡可能小的單獨的介面,而不要提供大的總介面。介面應該盡量細化,同時介面中的方法應該盡量少,每個介面中只包含乙個客戶端所需的方法即可,這種機制又稱為定**務,即為不同使用者提供寬窄不同的介面。

合成復用原則:優先使用物件組合,而不是通過繼承來達到復用的目的。

合成復用原則就是在乙個新的物件裡通過關聯關係(比如組合/聚合)來使用一些已有的物件,使之成為新物件的一部分。組合/聚合可以使系統更加靈活,降低類與類之間的耦合度。這樣子乙個類的變化對其它類的影響比較少

通過繼承來進行復用的主要問題在於繼承復用會破壞系統的封裝性,因為繼承會將基類的表現細節暴露給子類,由於積累的某些內部細節對於子類來說是可見的,所以這種復用又稱為白箱復用

這種復用主要有三種缺點

1.如果基類發生改變,那麼子類的實現也會不得不發生改變。

2.從基類繼承而來的實現時靜態的,不可能在執行時發生改變,沒有足夠的靈活性。

3.繼承只能在有限的環境中使用

由於組合或者聚合關係可以將已有的物件納入到新物件中,使之稱為新物件的一部分,因此新物件可以呼叫已有物件的功能,這樣做可以使成員物件的內部細節對於新物件來說不可見,所以這種復用又稱為黑箱復用。和繼承相比,耦合度相對低,成員變化對新物件的影響不大,合成復用可以在執行時動態進行。

迪公尺特法則要求乙個軟體實體應該盡可能少的和其他實體發生相互作用。這樣做在其中乙個模組發生修改的時候會盡可能少地影響到其他模組,擴充套件也相對容易。應用迪公尺特法則可以降低系統的耦合度,使得類和類之間保持鬆散的耦合關係。

用生動的話來說,迪公尺特法則主張**「不要和陌生人通話,只和你的朋友通訊」**。對於乙個物件來說,他的朋友包括:

1.當前物件本身(this)

2.以引數形式傳入到當前物件方法中的物件

3.當前物件的成員物件

4.如果當前物件的成員物件是乙個集合,那麼你和中的元素也是朋友

5.當前物件所建立的物件

這樣做可以降低系統的耦合度

迪公尺特法則還要求在設計系統時應該儘量減少物件之間的互動

在類的劃分上應該盡量建立松耦合的類,類之間的耦合度越低,越有利於復用,乙個處於松耦合的類一旦被修改也不會給相關的類造成很大的影響。

在類的結構設計上,每乙個類都應該盡量降低其成員變數和成員函式的訪問許可權、

在類設計上,只要有可能,乙個型別應該設計成不變類

設計模式 物件導向設計原則

物件導向設計原則為支援可維護性復用而誕生,這些原則蘊含在很多設計模式中,它們是從許多設計方案中總結出的指導性原則。最常見的7種物件導向設計原則如下表所示 使用頻率 單一職責原則 single responsibility principle,srp 乙個類只負責乙個功能領域中的相應職責 開閉原則 o...

設計模式 物件導向設計原則

世界是具體的,認知是抽象的。像自然界中的生物 植物 動物乙個個名詞,就是對一系列具體個體抽象出來的稱謂,而魚 老虎 樹等就是乙個個實在的具體。哦,也許你會說,樹也是對一系列具體個體的抽象出來的稱謂,對也不對,對是因為樹確實是一系列具體個體的抽象稱謂,不對是因為照這個邏輯下去,就會陷入死迴圈,直到小到...

設計模式 物件導向設計原則

類和方法的職責應該盡可能是單一的。其核心思想是 乙個類,最好只做一件事,只有乙個引起他的變化。對擴充套件開放,對修改關閉。繼承 依賴於抽象。a,高層次模組不依賴於低層次模組,他們都應該依賴於抽象。b,抽象不依賴於具體,具體應該依賴於抽象。對介面程式設計,對基類程式設計 使用小而專的介面,介面的定義盡...