學習設計模式六大設計原則之一

        在開始學習編程的時候,也看見過設計模式有關的書,那時感覺不到設計模式的重要性,感覺不用照樣可以實現相應的功能,隨着學習的深入對設計模式有了更深入的認識。沒有設計模式只能蓋個小土房,而設計模式是要蓋高樓大廈的。

一、單一職責原則(Single Responsibility Principle, SRP);

       英文解釋:There should never be more thanone reason for a class to change.通俗點說就是一個類只幹一件事,很適合現在工業的分工細化等等;

       在我們寫代碼的過程中肯定會有修改的地方,如果一個類集成很多種動作,那麼我們修改起來就會很麻煩,這個時候就需要單一職責啦,一個類只負責一個職責,當需要添加或修改職責時,我只需要修改相應的職責類就行了,不需要關注其他的,這樣我們就提高了代碼的可維護性。

       優點:1、類的複雜性降低,各司其職,互不干涉。

                  2、可讀性提高,結構清晰。

                  3、和維護性提高,接口變更,只對相應的實現類有影響。

       注意:單一職責這個“職責”在實際中並沒有實際的定義,沒有明確的邊界定義。這就需要自己看情況而定啦,切記不可過分細化,這樣不但沒有得到想要的結果,反而增加了程序的複雜性

二、里氏替換原則(Liskov Substitution Principle, LSP);

       里氏替換原則是解決把繼承中利最大化,弊最小化的問題。

     繼承有以下優點:1、代碼共享,減少代碼量,每個子類都擁有父類的屬性和方法。

                                      2、提高代碼的重用。

                                     3、子類類似父類,但又不同於父類,子類可以有自己的特色。

                                      4、提高代碼的擴展

                                     5、提高產品的開放性。

     缺點:1、繼承是侵入性的,一旦繼承了父類就必須接受父類的屬性和方法。

                 2、降低代碼的靈活性,子類在父類的基礎之上,會受到父類的約束。

                3、增強程序的耦合性,一旦父類的屬性修改,子類必須進行相應的或者更大工作量的更改。

        英文解釋:If for each object o1 of type S there is an object o2of type T such for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substitued for o2 then S is a subtype of T.。所有引用基類的地方都必須透明的使用其子類的對象。

里氏替換原則四句話:

      1、子類必須完全實現父類的方法。在類中調用其他類時務必要使用父類或者接口,如果不能使用父類或者接口,則說明類的設計已經違背了LSP原則。如果子類不能完整的實現父類的方法,或者父類的某些方法在子類中已經發生“畸變”,則建議斷開父類繼承關係,採用依賴、聚集、組合等關係替代繼承。

       2、子類可以有自己的個性。

       3、覆蓋或者實現父類的方法時,輸入參數可以被放大。如果子類的前置條件較小,子類在沒有覆蓋父類的方法前提下,子類方法被執行了,這回引起業務邏輯的混亂。在實際中,父類一般是抽象類,而子類是實現類,傳遞一個這樣的實現類,會扭曲父類的意圖,引起意想不到的邏輯混亂

       4、覆蓋或者實現父類的方法時輸出的結果可以被縮小。

      採用里氏替換原則的目的就是增強程序的健壯性,版本升級時可以保持非常好的兼容性。即使增加子類,原有子類還可以繼續運行,在實際項目中,每個子類對應不同的業務含義,使用父類作爲參數,傳遞不同的子類完成不同的業務邏輯,相當完美。

三、依賴倒置原則(Dependence Inversion Principle, DIP);

        High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.

       高層模塊不應該依賴低層模塊,兩者都應該依賴抽象(接口和抽象類)。

       抽象不應該依賴細節。

       細節應該依賴抽象。

       在Java中的表現爲:模塊間的依賴通過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係通過接口或者抽象類產生;抽象不依賴於實現類;實現類依賴抽象類或者接口;也就是面向接口的編程。

       依賴倒置可以減少類間的耦合性,提高穩定性,降低並行開發的風險,提高代碼的可維護性和擴展性。

通過上圖可以得出,如果我們在增加汽車類的時候,只需要實現ICar接口就行,對其他的任何東西都不影響,這就增加了程序的健壯性。當周圍環境變化時,其他的類任然能做到渾然不動

        依賴有三種寫法:構造函數傳遞依賴對象;Setter方法傳遞依賴對象;接口聲明依賴對象;

其本質就是通過抽象是各個類或者模塊的實現彼此獨立,不互相影響,實現模塊間的鬆耦合,我們在項目中使用需要遵循如下規則:1、每個類儘量都有接口和抽象類,或者抽象類和接口兩者都具備;

        2、變量的表面類型儘量是接口或者抽象類;

        3、任何類都不應該從具體類派生;

        4、儘量不要覆寫基類的方法;

        5、結合里氏替換原則使用;

      

發佈了36 篇原創文章 · 獲贊 20 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章