設計模式六大原則之黎克特制代換原則

2021-10-05 11:14:44 字數 1777 閱讀 8406

目錄

1、什麼是黎克特制代換原則(liskov substitution principle)?

2、為什麼使用lsp?

3、如何正確使用lsp?

lsp最正宗的定義是:如果每乙個型別為t1的物件o1,都有型別為t2的物件o2,使得以t1定義的所有程式p在所有的物件o1都替換成o2時,程式p的行為沒有發生變化,那麼型別t2是型別t1的子型別。

即:子類必須完全實現父類的方法。

黎克特制代換原則是物件導向設計的基本原則之一。 黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp 是繼承復用的基石,只有當派生類可以替換掉基類,且軟體單位的功能不受到影響時,基類才能真正被復用,而派生類也能夠在基類的基礎上增加新的行為。黎克特制代換原則是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化,而基類與子類的繼承關係就是抽象化的具體實現,所以黎克特制代換原則是對實現抽象化的具體步驟的規範

面對物件裡面的父類和子類,並不完全等於現實社會的包含關係。就是說物件1在現實社會中是屬於物件2的,但是根據lsp,物件1不能是物件2的子類,否則就是違反了lsp,也是違反了開閉原則。違反了會怎麼樣?其實也不會怎麼樣,但是設計模式是人們進過很多專案實戰,最終提煉出來的指導性的內容,對於專案的壯碩性和可維護性等方面是非常有益的。

第乙個例子:正方形不是長方形。

從數學上的分類,正方形肯定屬於長方形,但是,從物件導向的角度看,正方形設計為長方形的子類並不是乙個好的設計。

長方形類:

public class rectangle 

public void setlength(double length)

public double getwidth()

public void setwidth(double width)

}

正方形類:由於正方形的長和寬相等,所以setlength和setwidth要保證length==width;

public class square extends rectangle 

public void setwidth(double width)

}

那麼問題就來了:假如我們把乙個普通長方形作為引數傳入resize方法,就會看到長方形寬度逐漸增長的效果,當寬度大於長度,**就會停止,這種行為的結果符合我們的預期;假如我們再把乙個正方形作為引數傳入resize方法後,就會看到正方形的寬度和長度都在不斷增長,**會一直執行下去,直至系統產生溢位錯誤。所以,普通的長方形是適合這段**的,正方形不適合。

class testrectangle }}

可以看到如果我們的軟體要完全符合lsp,需要投入一定量的分析。

在大中型的專案中,是一定要講究軟體工程的思想,講究規範和流程的,否則人員協作和後期維護將會是非常困難的。

對於小型的專案可能相應的要簡化很多,可能取決於時間、資源、商業等各種因素,但是多從軟體工程的角度去思考問題,對於系統的健壯性、可維護性等效能指標的提高是非常有益的。

大家可以根據自己的需要(當然也不要偷懶),盡量的滿足lsp。其實,這也是一種考慮、涉及上面的好習慣。

外裡科技

英雄賺wxid_8awklmbh1fzm22

qq1247408032

開源**

設計模式六大原則 黎克特制替換原則

設計模式總覽 黎克特制代換原則 liskov substitution principle lsp 物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現 並且完全察覺不出父類物件和子類物件的區別。黎克特制代換原則是乙個規範性原則,它是繼承復用的基石。只有按照這個...

六大原則之黎克特制替換原則

如果對乙個型別為s的物件o1,都有型別為t的物件o2,使得以s定義的所有程式p 中所有的物件o1都替換成o2是,程式p的行為沒有發生變化,那麼型別t是型別s的子型別。按照黎克特制替換原則,當多個類之間存在繼承關係時,通常應該使用父類或介面來指向子類的物件,這樣有利於提高系統的可擴充套件性。我們都知道...

設計模式之六大原則 黎克特制替換原則(LSP)

黎克特制替換原則 liskov substitution principel 是解決繼承帶來的問題。繼承的優點 繼承的缺點 定義 所有引用基類的地方必須能透明地使用其子類的物件。通俗點講,只要父類能出現的地方子類就可以出現,而且替換為子類也不會產生任何錯誤或異常,使用者可能根本就不需要知道是父類還是...