Open-Close Principle(OCP):一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。目的就是保證程序的擴展性好,易於維護和升級。編程
開閉原則被稱爲面向對象設計的基石,實際上,其餘原則均可以看做是實現開閉原則的工具和手段。意思就是:軟件對擴展應該是開放的,對修改是封閉的,通俗來講就是,開發一個軟件時,應該對其進行功能擴展,而在進行這些擴展時,不須要對原來的程序進行修改。設計模式
好處是:軟件可用性很是靈活,擴展性強。須要新的功能時,能夠增長新的模塊來知足新需求。另外因爲原來的模塊沒有修改,因此不用擔憂穩定性的問題。函數
Single-Responsibilitiy Principle(SRP):對一個類而言,應該僅有一個引發它變化的緣由。若是存在多於一個動機去改變一個類,那麼這個類就具備多於一個的職責,就應該把多餘的職責分離出去,再去建立一些類來完成每個職責。工具
舉個例子:一我的身兼數職,而這些事情相關性不大,甚至有衝突,那他就沒法很好的解決這些問題職責,應該分到不一樣的人身上去作。設計
單一職責原則是實現高內聚低耦合的最好方法,沒有之一。對象
Liskov Substitution Principle:子類能夠擴展父類的功能,可是不能改變父類原有的功能。繼承
在第一條原則開放封閉原則中,主張「抽象」和「多態」。維持設計的封裝性「抽象」是語言提供的功能,「多態」由繼承語意實現。所以如何去度量繼承關係中的質量?接口
答案是:繼承必須明確確保超類(父類)所擁有的性質在子類中仍然成立。ip
在面向對象的思想中,一個對象就是一組狀態和一系列行爲的組合體。狀態是對象的內在特性,行爲是對象的外在特性。LSP表述的就是在同一繼承體系中的隊形應該具備共同的行爲特徵。ci
Dependence Inversion Principle(DIP):是一個類與類之間的調用規則。這裏的依賴就是代碼中的耦合。高層模塊不該該依賴底層模塊,兩者都應該依賴其抽象了;抽象不依賴細節;細節應該依賴抽象。接口編程。
主要思想就是:若是一個類中的一個成員或者參數成爲一個具體的類型,那麼這個類就依賴這個具體類型。若是在一個繼承結構中,上層類中的一個成員或者參數爲一個下層類型,那麼就是這個繼承結構高層依賴底層,就要儘可能面向抽象或者接口編程。
舉例:存在一個Driver類,成員爲一個Car對象,還有一個driver()方法,Car對象中有兩個方法start()與stop()。顯然Driver依賴Car,也就是說Driver類調用了Car類中的方法。可是當增長Driver類對於Bus類的支持時(司機有須要開公交車),就必須更改Driver中的代碼,就破壞了開放封閉原則。根本緣由在於高層的的Driver類與底層的Car類僅僅的耦合在一塊兒的。解決方法之一就是:對Car類和Bus類進行抽象,引入抽象類Automoble。而Car和Bus則是對Automobile的泛化。
通過這樣的改造發現,本來的高層依賴底層,變成了高層與底層同時依賴抽象。這就是依賴倒轉原則的本質。
接口隔離原則(Interface Segregation Principle):用於恰當的劃分角色和接口,具備兩種含義:一、用戶不該該依賴它不須要的藉口;二、類間的依賴關係應該創建在最小的的接口上。
將這兩個定義歸納爲一句話:創建單一接口,代替龐大臃腫的接口。通俗來講就是:接口儘可能細化,同時保證接口中的方法儘可能的少。一個接口中包含太多的行爲時,會致使它們與客戶端的不正常依賴關係,要作的就是分離接口,從而實現解耦。
回到上述的單一職責原則,要求行爲分離接口接口細化,感受有些相同。但實際上,單一職責原則要求類與接口的職責單一,注重的是職責,沒有要求接口儘可能的少。
在接口隔離原則中,要求儘可能使用多個專門的接口。專門的接口也就是提供給多個模塊的接口。提供給幾個模塊就應該有幾個接口,而不是創建一個臃腫龐大的接口,全部的模塊均可以訪問。
可是接口的設計是有限度的。接口的設計粒度越小系統越靈活,這是事實,可是接口太多這也就使得結構複雜,維護難度大。所以實際中,怎樣把握就靠開發的經驗和常識了。
Law of Demeter(最小知識原則):一個對象應該對其餘對象有最少的瞭解。通俗來講就是,一個類對本身須要耦合或者調用的類知道的最少,你類內部怎麼複雜,我無論,那是你的事,我只知道你有那麼多公用的方法,我能調用。
迪米特原則不但願類與類之間創建直接的接觸。若是真的須要有聯繫,那麼就經過它們的友元類來傳達。舉例來講:你須要買房子了,如今存在三座合適的樓盤A,B,C,可是你沒必要直接去樓盤買樓,而是在售樓處去了解狀況。這樣就減小了你(購房者)與樓盤兩個類之間耦合。
可是應用迪米特原則極可能會形成一個後果:系統會存在大量的中介類,這些類(如上面的售樓處類)之因此存在是爲了傳遞類之間的相互調用關係,這就必定會程度上增長了系統的複雜度。
迪米特原則核心觀念就是:類間解耦,弱耦合。