OOP程序七大原則

開閉原則

開閉原則至關於全部原則的祖先,主張對修改關閉,對拓展開放.java

里氏替換原則

當兩個類有繼承關係時,子類不能修改父類的方法和變量,里氏替換中的替換指的是:當有父類出現的地方,這個父類能夠替換成子類,並且對程序沒有影響,這就遵循了里氏替換原則;當替換成子類時對程序有影響,說明子類修改了父類的方法,就沒有遵循里氏替換原則了;程序員

依賴倒置原則

依賴倒置原則是對開閉原則的一個實現,也是主張對拓展開放,對修改關閉.它的核心思想是面對接口編程,不要面對具體實現編程編程

來自C語言中文網

這是一個遵照依賴倒置原則的UML圖,原來的話當客戶購買商品時,shopping這個方法要傳入相應的網店進去,當要更改店鋪時,就要修改Cusromer這個類裏的shopping方法,而如今,只要定義一個Shop接口,全部的店鋪都實現這個接口的方法,顧客類的shopping方法只要傳入Shop這個接口類就能夠了.而後具體實現的時候,要到哪裏買,就傳入哪個網店就能夠了,而不用修改Cusromer這個類的方法;設計模式

//代碼來之'C語言中文網'
public class DIPtest
{
    public static void main(String[] args)
    {
        Customer wang=new Customer();
        System.out.println("顧客購買如下商品:"); 
        wang.shopping(new ShaoguanShop()); 
        wang.shopping(new WuyuanShop());
    }
}
//商店
interface Shop
{
    public String sell(); //賣
}
//韶關網店
class ShaoguanShop implements Shop
{
    public String sell()
    {
        return "韶關土特產:香菇、木耳……"; 
    } 
}
//婺源網店
class WuyuanShop implements Shop
{
    public String sell()
    {
        return "婺源土特產:綠茶、酒糟魚……"; 
    }
} 
//顧客
class Customer
{
    public void shopping(Shop shop)
    {
        //購物
        System.out.println(shop.sell()); 
    }
}

//輸出
顧客購買如下商品:
韶關土特產:香菇、木耳……
婺源土特產:綠茶、酒糟魚……

單一職責

單一職責要求一個類只負責一項職責.  這個聽起來很簡單,可是實際應用上卻很是的難把握.由於這個職責在中國是很是抽象的概念,中國是一個文化底蘊很是豐富的國家,就像<<設計模式之禪>> 這本書裏所說的例子:好比說中國的筷子,他既能夠當刀來分割食物,也能夠當叉子來叉取食物,而在國外,叉子就是叉子,用來取食物的,刀就是用來分割食物的;因此這個單一職責要求軟件開發人員有很是豐富的實踐經驗.否則很難把握;框架

迪米特法則

迪米特法則也稱最小知道原則,一個類對外暴露的東西越少越好.spa

  1. 從依賴者的角度來講,只依賴應該依賴的對象。
  2. 從被依賴者的角度說,只暴露應該暴露的方法。

我的理解:當A類須要調用B類的三個方法才能實現的功能時,B類能夠對這三個方法進行一個封裝,而後只暴露封裝的這個方法給A,這樣A就只須要調用B的這個封裝的方法就能夠了,當B的三個方法中有修改的時候,只要修改B這個對外封裝的方法就能夠,而A調用者卻不用改變,由於A只知道調用這個方法能夠實現功能,而不用具體管B內部是怎麼實現的,下降了程序的耦合度;.net

接口隔離原則

這個和單一職責有點相似,不過仍是不同的.設計

  • 單一職責原則注重的是職責,而接口隔離原則注重的是對接口依賴的隔離。
  • 單一職責原則主要是約束類,它針對的是程序中的實現和細節;接口隔離原則主要約束接口,主要針對抽象和程序總體框架的構建。

官方定義:要求程序員儘可能將臃腫龐大的接口拆分紅更小的和更具體的接口,讓接口中只包含客戶感興趣的方法,下降程序耦合度。code

這個法則也要根據實際的業務場景來應用,若是粒度控制的過小,就會致使類的急劇增長,明明一個功能只要三四個類,若是粒度小的話,就會變成十幾個,甚至幾十個,雖然這樣程序耦合度低,比較靈活,可是維護難啊.若是粒度大,耦合度就會高,程序不靈活.因此這個原則要求技術人員有足夠的實踐,經驗和領悟;對象

合成複用原則

它要求在軟件複用時,要儘可能先使用組合或者聚合等關聯關係來實現,其次才考慮使用繼承關係來實現。若是要使用繼承關係,則必須嚴格遵循里氏替換原則。合成複用原則同里氏替換原則相輔相成的,二者都是開閉原則的具體實現規範。

若是不瞭解什麼是組合和聚合的話能夠看看這個篇文章<<組合、聚合與繼承的愛恨情仇>>,講的挺好的

總結

在程序設計中,儘可能遵循OOP七大原則.不過有句話說的好,規則是死的,人是活的.意思是這七大原則有時候也不是萬能的,有時候有的業務場景若是遵循了這些原則,反而變得難維護,因此一切都要從實際出發,23種設計模式也是同樣,不要按死規則來.

相關文章
相關標籤/搜索