閱讀759 返回首頁    go 阿裏雲 go 技術社區[雲棲]


設計模式六大原則--裏氏代換原則

       背景

       上一篇我總結了一下依賴倒轉原則,查了很多資料發現凡總結依賴倒轉原則的時候,大多數人也會把裏氏代換原則順道也給總結了。Why?還是讓我們先來看看裏氏代換原則(Liskov Substitution Principle, LSP)吧。

       定義

       Functions that use pointers or referencesto base classesmust be able to use objects of derived classes without knowingit.(子類型必須能夠替換掉它們的父類型。)

       詳細說明

       通俗的將就是一個軟件實體如果使用的是一個父類的話,那麼一定使用於其子類,而且它覺察不出父類對象和子類對象的區別。也就是說,在軟件裏,把父類都替換成他的子類,程序的行為沒有變化。

       示例

       例1:比方說,貓是繼承動物類以動物的身份擁有吃、喝、跑、叫等行為,當某一天我們需要豬、牛、羊也擁有類似的行為,由於它們都集成動物,所以處理更改實例化的地方,程序其他處不需要改變。

                  

(ps:正是由於裏氏代換原則,才使得開放-封閉成為可能)

       例2:裏氏代換原則是倒轉依賴原則的基礎,由於子類型的可替換性才使得使用父類類型的模塊在無需修改的情況下就可以擴展。

                                   

(ps:這裏有更加詳細的例子https://blog.csdn.net/fangaoxin/article/details/6717233

       優劣

       優點

       代碼共享,減少創建類的工作量,每個子類都擁有父類的方法和屬性;提高代碼的重用性; 提高代碼的可擴展性;提高產品或項目的開放性。

       缺點

       繼承是侵入性的。隻要繼承,就必須擁有父類的所有屬性和方法;降低代碼的靈活性。子類必須擁有父類的屬性和方法,讓子類自由的世界中多了些約束;增強了耦合性。當父類的常量、變量和方法被修改時,必需要考慮子類的修改,而且在缺乏規範的環境下,這種修改可能帶來非常糟糕的結果——大片的代碼需要重構。

(更優秀的文章:https://wenku.baidu.com/link?url=_Gm0QpDzm8sNJvJ0N3LsHhx-Ooot4OPV4N6C7MVQR1ficR09SxOlq4IT6GrweUHg9hWnDOvdz3_LOWLTNIprv1dNiagqdCvy_Y8x0p0yjiK)

 


最後更新:2017-04-03 12:55:07

  上一篇:go 搶紅包的紅包生成算法
  下一篇:go 設計模式之部分-整體模式