1. 程式人生 > >軟體設計模式七大原則

軟體設計模式七大原則

設計模式七大原則:

1.開放-封閉原則
2.單一職責原則
3.依賴倒轉原則
4.迪米特法則(也稱為最小知識原則)
5.介面隔離原則
6.合成/聚合複用原則
7.里氏代換原則

一.開放-封閉原則

概念:一個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉。模組應該儘量在不修改原始碼的情況下進行擴充套件。
在軟體週期內,因為變化、升級和維護等原因需要對軟體原有程式碼進行修改時,可能會給程式碼引入錯誤,也可能會使我們不得不對整個功能進行重構,並且需要原有程式碼經過重新測試。當軟體需求變化時,儘量通過擴充套件軟體實體的行為來實現變化,而不是通過修改已有程式碼來實現變化。
開放封閉原則是面向物件設計的核心所在,遵循這個原則可以帶來面向物件技術所聲稱的巨大好處,也就是可維護、可擴充套件、可複用、靈活性好。開發人員應該僅對程式中呈現的頻繁變化的那些部分作出抽象,然而,對於應用程式中的每個部分都刻意的進行抽象同樣不是一個好主意。拒絕不成熟的抽象和抽象本身一樣重要。
注意事項:
  1.通過介面或者抽象類約束擴充套件,對擴充套件進行邊界限定,不允許出現在介面或抽象類中不存在的public方法。
  2.引數型別、引用物件儘量使用介面或者抽象類,而不是實現類
  3.抽象層儘量保持穩定,一旦確定不允許修改。

二.單一職責原則

概念:就一個類而言,應該僅有一個引起它變化的原因。
  當我們在做程式設計的時候,很自然的回個一個類加上各種各樣的功能。這樣意味著,無論任何需求要來,你都需要更改這個類,這樣其實是很糟糕的,維護麻煩,複用不可能,也缺乏靈活性。如果一個類承擔的職責過多,就等於把這些職責耦合起來,一個職責變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計會遭到很多意想不到的破壞。

三.依賴倒轉原則

概念:依賴倒轉原則是程式要依賴於抽象介面,不要依賴於具體實現。簡單的來說就是要求對抽象進行程式設計,不要對實現進行程式設計,這樣就降低了客戶與實現模組的耦合。
  有時候為了程式碼複用,一般會把常用的程式碼寫成函式或類庫。這樣開發新專案的時候直接用就行了。比如做專案的時候大多要訪問資料庫,所以我們把訪問資料庫的程式碼寫成了函式。每次做專案去呼叫這些函式。那麼問題來了,我們要做新專案的時候,發現業務邏輯高層模組都是一樣的,但客戶卻希望使用不同的資料庫或儲存方式,這時就出現了麻煩。我們希望能再次利用這些高層模組,但是高層模組都是與低層的訪問資料庫繫結在一起,沒辦法複用這些高層的模組。所以不管是高層模組和底層模組都應該依賴於抽象,具體一點就是介面或者抽象類,只要介面是穩定的,那麼任何一個更改都不用擔心。
  注意事項:
  1.高層模組不應該依賴於低層模組。兩個都應該依賴抽象。
  2.抽象不應該依賴結節。細節應依賴於抽象。

四.迪米特法則(也稱為最小知識原則)

概念:一個軟體實體應當儘可能的少與其他實體發生相互作用。每一個軟體單位對其他軟體單位都只有最少的知識,而且侷限於那些與本單位密切相關的軟體單位。迪米特法則的初衷在於降低類之間的耦合。由於每個類儘量減少對其他類的依賴,因此,很容易使得系統的功能模組功能獨立,相互之間不存在(或很少有)依賴關係。迪米特法則不希望類之間建立直接的聯絡。如果有真的需要建立聯絡的,也希望能通過他的友元類來轉達。因此,應用迪米特法則有可能造成一個後果就是:系統中存在大量的中介類,這些類之所以存在完全是為了傳遞類之間的相互關係,這在一定程度上增加了系統的複雜度。

五.介面隔離原則

概念:客戶端不應該依賴他不需要的介面,類間的依賴關係應建立在最小的介面上。
  介面隔離原則的核心定義,不出現臃腫的介面,但是“小”是有限度的,首先就是不能違反單一職責原則。

六.合成/聚合複用原則

概念:合成/聚合複用原則經常又叫做合成複用原則,就是在一個新的物件裡面使用一些已有的物件,使之成為新物件的一部分,新的物件通過這些物件的委派達到複用已有功能的目的。他的設計原則是:要儘量使用合成/聚合,儘量不要使用繼承。

七.里氏代換原則

概念:里氏代換原則是面向物件設計的基本原則之一。即任何基類可以出現的地方,子類一定可以出現。里氏代換原則是繼承複用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受影響時,基類才能被真正複用,而衍生類也能夠在積累的基礎上增加新的行為,里氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。在基類與子類的繼承關係就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規範。
  當滿足繼承的時候,父類肯定存在非私有的成員,子類肯定是得到了父類的這些非私有成員(假設,父類的成員全部是私有的,那麼子類沒辦法從父類繼承任何成員,也就不存在繼承的額概念了)。既然子類繼承了父類的這些非私有成員,那麼父類物件也就可以在子類物件中呼叫這些非私有成員。所以,子類物件可以替換父類物件的位置。
  在里氏帶環原則下,當需求有變化時,只需繼承,而別的東西不會改變。由於里氏代換原則才使得開放封閉稱為可能。這樣使得子類在父類無需修改就可以擴充套件。