單一職責原則
英文:Single Responsibility Principle,簡稱SRP。編程
定義
就一個類而言,應該僅有一個引發它變化的緣由。設計模式
描述
- 若是一個類承擔的職責過多,就等於把這些職責耦合在一塊兒,一個職責的變化可能會削弱或者抑制這個類完成其餘職責的能力。這種耦合會致使脆弱的設計,當變化發生時,設計會遭受到意想不到的破壞。
- 軟件設計真正要作的許多內容,就是發現職責並把那些職責相互分離。
- 若是能想到多於一個動機去改變一個類,那麼這個類就具備多於一個的職責。
開放-封閉原則
英文:Open Closed Principle,簡稱OCP。框架
定義
是說軟件實體(類、模塊、函數等)應該能夠擴展,可是不可修改。函數
描述
- 也就是對擴展是開放的,對更改是封閉的。
- 不管模塊是多麼的「封閉」,都會存在一些沒法對之封閉的變化。既然不可能徹底封閉,設計人員必須對於他設計的模塊應該對哪些變化封閉作出選擇。他必須把先猜想出最有可能發生的變化種類,而後構造抽象來隔離那些變化。
- 在咱們最初編寫代碼時,假設變化不會發生。當變化發生時,咱們就建立抽象來隔離之後發生的同類變化。
- 面對需求,對程序的改動時經過增長新代碼進行的,而不是更改現有的代碼。
- 咱們但願的是開發工做展開不久就知道可能發生的變化。查明可能發生的變化所等待的時間越長,要建立正確的抽象就越困難。
- 開放-封閉原則是面向對象設計的核心所在。遵循這個原則能夠帶來面向對象技術,所聲稱的巨大好處,也就是可維護、可擴展、可複用、靈活性好。開發人員應該僅對程序中呈現出頻繁變化的那些部分做出抽象,然而,對應用程序中每一個部分都刻意的進行抽象不是一個好主意。拒毫不成熟的抽象和抽象自己同樣重要。
依賴倒轉原則
英文:Dependence Inversion Principle,簡稱DIP。設計
定義
高層模塊不該該依賴低層模塊,兩個都應該依賴抽象;抽象不該該依賴細節,細節應該依賴抽象。對象
描述
- 說白了就是,針對接口編程,不要對實現編程。
- 依賴倒轉其實能夠說是面向對象設計的標誌,用哪一種語言來編寫程序不重要,若是編寫時考慮的是若是針對抽象編程而不是針對細節編程,即程序中全部的依賴關係都是終止於抽象類或者接口,那就是對象的設計,反之那就是過程化的設計了。
里氏代換原則
英文:Liskov Substitution Principle,簡稱LSP。接口
定義
子類型必須可以替換掉它們的父類型。ip
描述
- 一個軟件實體若是使用的是一個父類的話,那麼必定適用於其子類,並且它察覺不出父類對象和子類對象的區別。也就是說,在軟件裏面,把父類都替換成它的子類,程序行爲沒有變化。
- 只有當子類能夠替換掉父類,軟件單位的功能不受影響時,父類才能真正被複用,而子類也可以在父類的基礎上增長新的行爲。
- 因爲子類型的可替換性才使得使用父類類型的模塊在無需修改的狀況下就能夠擴展。
迪米特法則
英文:Law of Demeter,簡稱LoD。ci
定義
也叫最少知識原則。若是兩個類沒必要彼此直接通訊,那麼這兩個類就不該當發生直接的相互做用。若是其中一個類須要調用另外一個類的某一個方法的話,能夠經過第三者轉發這個調用。開發
描述
- 迪米特法則的根本思想是強調了類之間的鬆耦合。
- 類之間的耦合越弱,越有利於複用,一個處在弱耦合的類被修改,不會對有關係的類形成波及。
接口隔離原則
雖然該原則在《大話設計模式》沒有明確指出,但實際上隱含在了其餘模式或原則中。
英文:Interface Segregation Principle,簡稱ISP。
定義
一個類對另一個類的依賴性應當創建在最小的接口上。客戶端程序不該該依賴它不須要的接口方法。
描述
- 接口隔離原則和單一職責原則在概念上有必定的交叉。二者都是爲了提升類的內聚性,下降它們之間的耦合性,體現了封裝的思想。但二者是不一樣的。
- 接口隔離原則強調的是接口對客戶端的承諾越少越好,而且作到專注。當某個客戶端程序的要求發生變化時迫使接口發生變化,影響到客戶端程序的可能性越小越好。
- 接口隔離原則注重的是對接口依賴的隔離,用於約束接口,主要針對抽象和總體框架的構建。
- 單一職責原則注重的是職責,用於約束類,主要針對程序中實現和細節。
總結
實際上不少設計模式在概念上也有必定的交叉,若是隻是根據一段代碼來判斷屬於哪一種設計模式,也是很難區分的,甚至還包含多種的混合。所以不要一直糾結於其中的思想到底屬於哪種,理解其中的含義並能應用至實際開發當中纔是最重要的。