一. 黎克特制代換原則
定義:
子型別必須能夠替換它們的父型別。[dh]
解釋:
也就是說,在軟體裡面,把父類都替換成子類,程式的行為沒有變化。也只有這樣父類才能真正被復用,而子類也能夠在父類的基礎上增加新的行為。這個原則是對繼承的乙個約束,也就是說,繼承中子類嚴格滿足"is-a"的關係。
所以,當你看到乙個繼承的時候,要習慣性的把他的父類和子類看成乙個整體,這樣會有助於你去理解各個類之間的關係。
由於黎克特制代換的原則,才使得開放-封閉成為了可能。正是由於子型別的可替換性才使得父類型別的模組在無需修改的情況下就可以擴充套件。
例如:
這個繼承關係就不滿足黎克特制代換原則。
二. 單一職責原則
定義:
就乙個類而言,應該僅有乙個引起他變化的原因。[dh]
解釋:
也就是說,不要把變化原因各不相同的職責放在一起,因為不同的變化會影響到不相干的職責。
再通俗一點地說就是,不該你管的事情你不要管, 管好自己的事情就可以了,多管閒事害了自己也害了別人。
這個就是說,乙個類盡量做到了功能單一,比如在mvc中,判斷資料的類和新增資料庫的類一定要分開。單一職能不是說職能多了我們實現不了,是為了後期的測試維護,每個類的很單一,我們找錯誤的時候就可以一步到位,新增新的功能的時候,也不用牽扯到很多的類。
三. "開放-封閉"原則
定義:
是說軟體實體(類,模組,函式等)應該可以擴充套件,但是不可以修改。 [dh]
解釋:
意思是,在乙個系統中,對於擴充套件是開放的,對於修改是關閉的,乙個好的系統是在不修改源**的情況下,可以擴充套件你的功能。
而實現開閉原則的關鍵就是抽象化。
在"開放-封閉"原則中,不允許修改的是抽象的類或者介面,允許擴充套件的是具體的實現類,抽象類和介面在"開放-封閉"原則中扮演著極其重要的角色,即要預知可能變化的需求,又預見所有可能已知的擴充套件,所以在這裡"抽象化"是關鍵!
當然對於修改,我們不可能完全避免,也不可能完全預知到未來的變化,所以我們要做到盡量去不要修改,或者少的修改就能達到我們的目標。一旦要修改,就要充分的考慮出以後要發生的變化,然後構造抽象來隔離這些變化。
最後不要刻意地進行抽象,拒絕不成熟的抽象也是很重要的。
四. 依賴倒轉原則
案例:
比如,我們做的專案大多要訪問資料庫,所以我們就把訪問資料庫的**寫成了函式,每次做新專案時就去呼叫這些函式。這就叫做高層模組依賴低層模組。
問題:
當客戶希望使用不同的資料庫時,就會出現麻煩。因為當我們希望再次利用這些高層模組,但高層模組都與低層的訪問資料庫繫結在一起的,也就沒有辦法復用這些高層模組了。
說明:
如果不管高層模組還是低層模組,它們都依賴於抽象,具體一點就是介面或抽象類,只要介面是穩定的,那麼任何乙個的更改都不用擔心其它受到影響,這就使得無論高層模組還是低層模組都可以很容易地被復用。
定義:
a:高層模組不應該依賴底層模組,兩個者應該依賴抽象。
b:抽象不應該依賴細節,細節應該依賴抽象。[dh]
解釋:
也就是說,要針對介面或抽象進行程式設計,不要對實現程式設計。
通俗的說就是,誰也不要依靠誰,除了約定的介面或抽象類。只有抽象的東西才是最穩定的,也就是說,我們依賴的是它的穩定。如果將來「抽象」也不穩定了,那麼誰穩定我跟誰!
五. 組合/聚合復用原則
定義:
盡量使用組合/聚合,盡量不要使用類繼承。
解釋:
優先使用組合/聚合將有助於你保持每個類被封裝,並被集中在單個任務上。這樣類和類的繼承層次會保持較小規模,並且不太可能增長為不可控制的龐然大物。
舉例:
可以看一下橋接(bridge)模式的實現,這個模式是典型的組合/聚合復用原則的應用。
六. 迪公尺特法則
定義:
如果兩個類不必彼此直接通訊,那麼這兩個類就不應當直接的相互作用。如果其中乙個類需要呼叫另乙個類的某乙個方法的話,可以通過第三者**這個呼叫。
解釋:
這個法則強調的前提是,在類的結構設計上,每乙個類都應當盡量降低成員的訪問許可權。
其根本思想是,強調了類之間的松耦合。
類之間的耦合越弱,越有利於復用,乙個處在弱耦合的類被修改,不會對有關係的類造成涉及。
七. 最後總結一下:
1. "開放-封閉"原則是設計模式的核心目標。
2. 依賴倒轉原則是到達"開放-封閉"原則的手段。
3. 黎克特制代換原則使得"開放-封閉"成為了可能。
4. 對於單個類設計來說,單一職責原則
和迪公尺特法則
是我們要時刻關注的。
設計模式的幾種原則
一.黎克特制代換原則 定義 子型別必須能夠替換它們的父型別。dh 解釋 也就是說,在軟體裡面,把父類都替換成子類,程式的行為沒有變化。也只有這樣父類才能真正被復用,而子類也能夠在父類的基礎上增加新的行為。這個原則是對繼承的乙個約束,也就是說,繼承中子類嚴格滿足 is a 的關係。所以,當你看到乙個繼...
設計模式 設計模式原則
1 單一職責原則 srp 乙個類應當只有乙個引起其變化的原因。使用單一職責原則的好處有 1 類的複雜性降低 2 可讀性提高 3 可維護性提高 4 變更引起的風險降低 2 黎克特制替換原則 lsp 在使用父類的地方,可以使用其子類替換。黎克特制替換原則的含義 1 子類必須完全實現父類的方法 2 子類可...
設計模式的設計原則
單一職責原則 srp 單一職責適用於 介面,類,方法 開放封閉原則 ocp 乙個軟體實體應當對外擴充套件開放,對修改關閉 關鍵 什麼叫做鉤子方法?是對於抽象方法或者介面中定義的方法的乙個空實現 在實際的運用中,例如有乙個介面,這個介面裡面有7個方法,而你只想用其中的乙個方法,那麼這時,你可以寫乙個抽...