設計模式之——六大原則

前言:

大家都知道,設計模式除了常用的23種設計模式以外,還有非常重要且經典的6大原則:

  • 單一職責原則

  • 里氏替換原則

  • 依賴倒置原則

  • 接口隔離原則

  • 迪米特原則

  • 開閉原則

六大原則是那些著名的程序員經過相當長的一段時間的開發經驗總結出來的,遵循這六大原則,能夠潛移默化地改變着我們的思維,能夠幫助我們碼出高可擴展、高可維護性的優秀代碼,能提高代碼的可閱讀性,保證了代碼的可靠性。所以想要作爲一名合格,優秀的程序猿,一定要掌握這六大開發原則,並運用到平時的代碼開發中。下面分別介紹一下這六大原則。

  • 單一職責原則

        每個類/接口/方法都應該有一個單一的功能。單一職責原則適用的範圍有接口、方法、類。按大家的說法,接口和方法必須 保證單一職責,類就不必保證,只要符合業務就行。

        設計接口/方法的時候,一定要規範的按照功能邏輯來開發這幾,做到一個接口/方法只做一件事,杜絕將幾種功能邏輯封裝到同一個接口/方法中,然後通過判斷參數去執行不同的功能。

        而對於類來說,一個類應該是負責一個實體的行爲,或同類實體的一方面行爲,不能將不同類的不同行爲封裝到一個類中,那樣閱讀性非常差,擴展性也很差。

優點:

1. 降低了類的複雜性,各個類/接口/方法職責都清晰明確的分開

2. 提高了代碼的可讀性和可維護性

3. 代碼改變引起的風險降低, 一個接口/方法的修改基本上只會影響到其自身的實現類或調用類,對其他的接口無影響,這對系統的擴展性、維護性都有非常大的幫助

  • 里氏替換原則

        子類型必須能夠替換它們的基類型。一個軟件實體如果使用的是一個基類,那麼當把這個基類替換成繼承該基類的子類,程序的行爲不會發生任何變化。軟件實體察覺不出基類對象和子類對象的區別。

        簡單來說就是父(父類)子(繼承類)關係中。兒子要會父親的所有的東西,兒子活得再爛也要有父親的水平。並且父親會的,兒子不能搞創新改變父親的東西,如果想搞創新,那麼自己新寫方法來實現自己的能力。

優點:
1. 子類可以形似父類,但又異於父類,“龍生龍,鳳生鳳,老鼠生來會打洞” 是說子擁有父的“種”

2. 代碼共享,減少重新創建並實現重複功能的工作量,提高代碼的重用性(每個子類都擁有父類的方法和屬性)

3. 提高代碼的可擴展性,實現父類的方法後不但繼承了父親的本領,還可以自己自由創作。很多開源框架的擴展接口都是通過繼承父類來完成的

4. 提高產品或項目的開放性。


缺點:

1. 繼承是侵入性的。只要繼承,就必須擁有父類的所有屬性和方法;

2. 降低代碼的靈活性。子類必須擁有父類的屬性和方法,讓子類自由的世界 中多了些約束;

3. 增強了耦合性。當父類的常量、變量和方法被修改時,需要考慮子類的修改,而且在缺乏規範的環境下,這種修改可能帶來非常糟糕的結果——大段的代碼需要重構。

  • 依賴倒置原則

        抽象不應該依賴於細節,細節應當依賴於抽象。換言之,要針對接口編程,而不是針對實現編程。

        依賴倒置原則可以實現多樣性。例如統一用接口“鳥”作爲參數,統一調用“鳥”的fly方法,但是傳入的則是鴕鳥,企鵝,燕子等不同的具體實例,那麼fly的表現形式就不同了,但是你又不需要修改調用代碼,因爲你是根據接口編程的。

再比如下面這張圖:

第一種實現方式的缺點是:Mother只能閱讀Book,如果想要看報或者其他類型的書籍就看不了了

第二種實現方式是應用了 依賴倒置原則,我們可以看到,我們只要傳一個實現了IReader接口/抽象類的類並實現接口方法或抽象方法,然後將實體傳給Mother就行了,提高了擴展性。

優點:

1.當需求變更的時候,可以很靈活的進行擴展,而不用破壞開閉原則。

還有,要實現依賴倒置原則,要有『面向接口編程』這個思維,掌握好這 個思維後,就可以很好的運用依賴倒置

  • 接口隔離原則

        建立單一接口,不要建立龐大臃腫的接口,儘量根據實際情況,具體業務具體分析,細化接口,接口中的方法儘量少。

        接口隔離原則跟單一職責原則很像,都是爲了精細化管理,將功能儘可能的細化。這樣,當某個功能出現問題的時候,可以快速的定位問題,並且在最小範圍內修復,功能的擴展也是一樣的。但是,接口也不能無限的小,那樣會產生大量的接口,造成設計過於負責。

  • 迪米特原則

        一個軟件實體應當儘可能少地與其他實體發生相互作用。,類的內部如何實現、如何複雜都與調用者或者依賴者沒關係,調用者或者依賴者只需要知道他要調用的方法即可,其他的一概不關心。簡單來說就是:不要和“陌生人”說話只與你的直接朋友通信

優點:

1.迪米特法則可降低系統的耦合度,使類與類之間保持鬆散的耦合關係,簡稱高內聚,低耦合

  • 開閉原則

       一個軟件實體應當對擴展開放,對修改關閉。即軟件實體應儘量在不修改原有代碼的情況下進行擴展。開閉原則可以在保證我們代碼的質量的前提下,實現功能的擴展,減少開發難度。

      開閉原則放最後來介紹是有原因的,細心的同學仔細想想,只要前面五種原則都遵循了,那麼開發出來的代碼自然就遵循了開閉原則

 

總結:

  • 單一職責原則告訴我們實現類要職責單一

  • 里氏替換原則告訴我們不要破壞繼承體系

  • 依賴倒置原則告訴我們要面向接口編程

  • 接口隔離原則告訴我們在設計接口的時候要精簡單一

  • 迪米特原則告訴我們要降低耦合

  • 開閉原則是總綱,告訴我們要對擴展開放,對修改關閉

這篇文章要是對你有幫助的話,記得點個贊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章