設計模式6大原則

zyl409214686發表於2018-01-09
一、單一職責原則(Single Responsibility Principle)

定義:就一個類而言, 應該僅有一個引起它變化的原因。

單一職責的劃分界限並不是那麼清晰,很多時候需要靠個人經驗界定。當然最大的問題就是對職責的定義,什麼是類的職責,以及怎麼劃分類的職責。

二、開放封閉原則(Open Close Principle)

定義:類、模組、函式等應該是可以擴充的,但是不可修改。

開閉原則指導我們,當軟體需要變化時,應該儘量通過擴充的方式來實現變化,而不是通過修改已有程式碼來實現。這裡的“應該儘量”4個字說明OCP原則並不是說絕對不可以修改原始類的。當我們嗅到原來的程式碼“腐化氣味”時,應該儘早地重構,以便使程式碼恢復到正常的“進化”過程,而不是通過整合等方式新增新的實現,這會導致型別的膨脹以及歷史遺留程式碼的冗餘。因此,在開發過程中需要自己結合具體情況進行考量,是通過修改舊程式碼還是通過繼承使得軟體系統更穩定、更靈活,在保證去除“程式碼腐化”的同時,也保證原有模組的正確性。

三、里氏替換原則(Liskov Substitution Principle)

注:它是開閉原則的具體實現手段之一,它的核心原理是抽象

定義:所有引用基類的地方必須能透明地使用其子類的物件。

里氏替換原則的核心原理是抽象,抽象又依賴於繼承這個特性,在OOP中,繼承的優缺點相當明顯,有點如下: (1)程式碼重用,減少建立類成本,每個子類擁有父類的屬性和方法; (2)子類和父類基本相似,但又與父類有所區別; (3)提高程式碼的可擴充性。 繼承的缺點: (1)繼承是侵入性的,只要繼承就必須擁有弗雷的所有屬性和方法; (2)可能造成子類程式碼的冗餘、靈活性降低,因為子類必須擁有弗雷的屬性和方法。 開閉原則和里氏替換原則往往是生死相依、不離不棄的,通過里氏替換來達到對擴充套件的開發,對修改的關閉效果。

四、依賴倒置原則(Dependence Inversion Principle)

注:關係到系統的可擴充性、擁抱變化的能力、開閉原則

定義:高層模組不應該依賴於低層模組,兩者都應該依賴於抽象。抽象不應該依賴於細節,細節應該依賴於抽象。

java中抽象指介面或抽象類,兩者都不能直接被例項化的;細節就是實現類,實現介面或者整合抽象類而產生的也就細節,也就是可以可以加上yige 關鍵字new產生的物件。高層模組就是呼叫端,低層模組就是具體實現類。依賴倒置原則在java中表現就是,模組間依賴通過抽象發生,實現類之間不發生直接依賴關係,其依賴關係是通過介面或者抽象類產生的。如果類與類直接依賴細節,那麼久會直接耦合。如此一來當修改時,就會同時修改依賴者程式碼,這樣限制了可擴充性。

五、 介面隔離原則(InterfaceSegregation Principles)

注:最小化, 減少依賴從而降低變更的風險。

定義:一個類對另一個類的依賴應該建立在最小的介面上。

建立單一介面,不要建立龐大臃腫介面;儘量細化介面,介面中方法儘量少。也就是說,我們要為各個類建立專用的介面,而不要試圖建立一個很龐大的介面供所有依賴它的類呼叫。 (1)介面儘量小,但是要有限度。對介面進行細化可以提高程式設計的靈活性;但是如果過小,則會造成介面數量過多,使設計複雜化。所以,一定要適度。 (2)為依賴介面的類定製服務,只暴露給呼叫的類需要的方法,它不需要的方法則隱蔽起來。只有專注得為一個模組提供定製服務,才能建立最小的依賴關係。 (3)提高內聚,減少對外互動。介面方法儘量少用public修飾。介面是對外的承諾,承諾越少對系統開發越有利,變更風險也會越少。

以上(單一職責、開閉原則、里氏替換、介面隔離、依賴倒置)五個原則被Bob大叔在21世紀早期定義為SOLID原則。作為物件導向程式設計的5個基本原則,當這些原則被一起使用時,它們使得一個軟體系統更清晰、簡單,最大程度地擁抱變化。

六、 迪米特原則(Law of Demeter)也稱最少知識原則

注:通過引入一個合理的第三者降低現有物件之間的耦合度。

定義:一個軟體實體應當儘可能少地與其他實體發生相互作用。

一個類應該對自己需要耦合或者呼叫的類知道最少, 類的內部如何實現與呼叫者或者依賴關係越密切,耦合度越大,當一個類發生變化時,對另一個類的影響也越大。 (1)在類的劃分上,應當儘量建立鬆耦合的類。類之間的耦合度約低,就越有利於服用。一個處於鬆耦合中的類一旦被修改,則不會對關聯的類造成太大的波及。 (2)在類的機構設計上, 每一個類都應當儘量降低其成員變數和成員函式的訪問許可權。 (3)在對其他類的引用上, 一個類對其他物件的引用應當降到最低。

相關文章