一個類只負責一項職責。 當超過一項職責須要負責時,須要增長新的類來負責新的職責,而不是在類中個性代碼。html
若是一個類承擔的職責太多,就是高度地職責耦合,很是不利於擴展功能。這是很是脆弱的設計。 容易發生修改一個地方而影響其餘地方的狀況。java
遵循單一職責原則的優勢:編程
里氏代換原則(Liskov Substitution Principle, LSP):全部引用基類(父類)的地方必須能透明地使用其子類的對象。設計模式
里氏代換原則告訴咱們,在一個軟件系統中,子類應該能夠替換任何基類可以出現的地方,而且通過替換之後,代碼還能正常工做。子類也可以在基類的基礎上增長新的行爲。架構
例若有兩個類,一個類爲BaseClass,另外一個是SubClass類,而且SubClass類是BaseClass類的子類,那麼一個方法若是能夠接受一個BaseClass類型的基類對象base的話,如:method1(base),那麼它必然能夠接受一個BaseClass類型的子類對象sub,method1(sub)可以正常運行。反過來的代換不成立,如一個方法method2接受BaseClass類型的子類對象sub爲參數:method2(sub),那麼通常而言不能夠有method2(base),除非是重載方法。函數
里氏代換原則是實現開閉原則的重要方式之一,因爲使用基類對象的地方均可以使用子類對象,所以在程序中儘可能使用基類類型來對對象進行定義,而在運行時再肯定其子類類型,用子類對象來替換父類對象。字體
包含4層含義:spa
不遵循里氏代換原則的後果是,寫代碼出錯的機率會大大增長。.net
定義:1.高層模塊不該該依賴低層模塊,兩者都應該依賴其抽象; 2.抽象不該該依賴細節;細節應該依賴抽象。設計
問題由來:類A直接依賴類B,假如要將類A改成依賴類C,則必須經過修改類A的代碼來達成。這種場景下,類A通常是高層模塊,負責複雜的業務邏輯;類B和類C是低層模塊,負責基本的原子操做;假如修改類A,會給程序帶來沒必要要的風險。
解決方案:將類A修改成依賴接口I,類B和類C各自實現接口I,類A經過接口I間接與類B或者類C發生聯繫,則會大大下降修改類A的概率。
依賴倒置原則基於這樣一個事實:相對於細節的多變性,抽象的東西要穩定的多。以抽象爲基礎搭建起來的架構比以細節爲基礎搭建起來的架構要穩定的多。在java中,抽象指的是接口或者抽象類,細節就是具體的實現類,使用接口或者抽象類的目的是制定好規範和契約,而不去涉及任何具體的操做,把展示細節的任務交給他們的實現類去完成。
傳遞依賴的三種寫法:
1.構造函數傳遞依賴對象
2.Setter方法傳遞依賴對象
3.接口聲明傳遞依賴對象
深刻了解能夠看:輕鬆學,淺析依賴倒置(DIP)、控制反轉(IOC)和依賴注入(DI)
舉例來講明接口隔離原則:
(圖1 未遵循接口隔離原則的設計)
這個圖的意思是:類A依賴接口I中的方法一、方法二、方法3,類B是對類A依賴的實現。類C依賴接口I中的方法一、方法四、方法5,類D是對類C依賴的實現。對於類B和類D來講,雖然他們都存在着用不到的方法(也就是圖中紅色字體標記的方法),但因爲實現了接口I,因此也必需要實現這些用不到的方法。
能夠看到,若是接口過於臃腫,只要接口中出現的方法,無論對依賴於它的類有沒有用處,實現類中都必須去實現這些方法,這顯然不是好的設計。若是將這個設計修改成符合接口隔離原則,就必須對接口I進行拆分。在這裏咱們將原有的接口I拆分爲三個接口,拆分後的設計如圖2所示:
(圖2 遵循接口隔離原則的設計)
迪米特法則有不少種說法,好比:一個類應該應該對其餘類儘量瞭解得最少;類只與直接的朋友通訊等等。可是其最終目的只有一個,就是讓類間解耦。
就是說一個對象應該對其餘對象保持最少的瞭解。正如最少知識原則這個定義同樣,一個類應該對其耦合的其餘類或所調用的類知道得最少。所耦合的類內部不管如何複雜,怎麼實現的我都不須要知道,我只調用你public出來的這些方法,其餘都不用知道。
所謂開放封閉原則就是軟件實體應該對擴展開放,而對修改封閉(不須要修改接口,就能實現新的需求)。開放封閉原則是全部面向對象原則的核心。軟件設計自己所追求的目標就是封裝變化,下降耦合,而開放封閉原則正是對這一目標的最直接體現。
開放封閉原則主要體如今兩個方面:
爲何要用到開放封閉原則呢?
軟件需求老是變化的,世界上沒有一個軟件的是不變的,所以對軟件設計人員來講,必須在不須要對原有系統進行修改的狀況下,實現靈活的系統擴展。
如何作到對擴展開放,對修改封閉呢?
實現開放封閉的核心思想就是對抽象編程,而不對具體編程,由於抽象相對穩定。讓類依賴於固定的抽象,因此對(抽象類)修改就是封閉的;而經過面向對象的繼承和多態機制,能夠實現對抽象體的繼承,經過覆蓋其方法來改變固有行爲,實現新的擴展方法,因此對於擴展就是開放的(即對接口添加新的實現類來知足新的需求)。
對於違反這一原則的類,必須經過重構來進行改善。經常使用於實現的設計模式主要有Template Method模式和Strategy 模式。而封裝變化,是實現這一原則的重要手段,將常常變化的狀態封裝爲一個類。
代碼參考例子:以銀行業務員爲例