開閉原則至關於全部原則的祖先,主張對修改關閉,對拓展開放.java
當兩個類有繼承關係時,子類不能修改父類的方法和變量
,里氏替換中的替換
指的是:當有父類出現的地方,這個父類能夠替換
成子類,並且對程序沒有影響,這就遵循了里氏替換原則;當替換成子類時對程序有影響,說明子類修改了父類的方法,就沒有遵循里氏替換原則了;程序員
依賴倒置原則是對開閉原則的一個實現,也是主張對拓展開放,對修改關閉.它的核心思想是面對接口編程,不要面對具體實現編程
.編程
這是一個遵照依賴倒置原則的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
我的理解:當A類須要調用B類的三個方法才能實現的功能時,B類能夠對這三個方法進行一個封裝,而後只暴露封裝的這個方法給A,這樣A就只須要調用B的這個封裝的方法就能夠了,當B的三個方法中有修改的時候,只要修改B這個對外封裝的方法就能夠,而A調用者卻不用改變,由於A只知道調用這個方法能夠實現功能,而不用具體管B內部是怎麼實現的,下降了程序的耦合度;.net
這個和單一職責有點相似,不過仍是不同的.設計
官方定義:要求程序員儘可能將臃腫龐大的接口拆分紅更小的和更具體的接口,讓接口中只包含客戶感興趣的方法,下降程序耦合度。
code
這個法則也要根據實際的業務場景來應用,若是粒度控制的過小,就會致使類的急劇增長,明明一個功能只要三四個類,若是粒度小的話,就會變成十幾個,甚至幾十個,雖然這樣程序耦合度低,比較靈活,可是維護難啊.若是粒度大,耦合度就會高,程序不靈活.因此這個原則要求技術人員有足夠的實踐,經驗和領悟;對象
它要求在軟件複用時,要儘可能先使用組合或者聚合等關聯關係來實現,其次才考慮使用繼承關係來實現。若是要使用繼承關係,則必須嚴格遵循里氏替換原則
。合成複用原則同里氏替換原則相輔相成的,二者都是開閉原則的具體實現規範。
若是不瞭解什麼是組合和聚合的話能夠看看這個篇文章<<組合、聚合與繼承的愛恨情仇>>,講的挺好的
在程序設計中,儘可能遵循OOP七大原則.不過有句話說的好,規則是死的,人是活的
.意思是這七大原則有時候也不是萬能的,有時候有的業務場景若是遵循了這些原則,反而變得難維護,因此一切都要從實際出發,23種設計模式也是同樣,不要按死規則來.