LSP 里氏替換原則

Liskov's Substitution Principle

動(dòng)機(jī)

我們進(jìn)行模塊設(shè)計(jì)時(shí)一般都是先建立一些繼承體系,也就是一些抽象基類,然后新建派生類來擴(kuò)展功能。

我們必須確保新的派生子類只是擴(kuò)展基類的功能而沒有將其替換掉。不然的話,在現(xiàn)有模塊引入新建的類的時(shí)候可能會(huì)產(chǎn)生副作用。

LSP 規(guī)定如果程序中模塊使用的是基類,那么基類的引用可以替換成子類,而不會(huì)影響到模塊功能。

目的

派生子類必須能完全替代其基類。個(gè)人理解是,子類和基類對(duì)外暴露的行為必須一致。

例子

以下是違背里氏替換原則的一個(gè)經(jīng)典例子。例子中用到了2個(gè)類:RetangleSquare。我們假設(shè)在程序某處使用到了Retangle 實(shí)例。 接著我們擴(kuò)展應(yīng)用,增加 Square 類。Square 由工廠模式根據(jù)一些條件返回,我們不清楚具體返回什么類型。不過,我們知道返回的肯定是 Retangle。我們獲取 Retangle 對(duì)象實(shí)例,把寬設(shè)成5,高設(shè)成10,然后得到面積值。對(duì)于長方形而言,寬為5,高為10的話面積應(yīng)該是50,但是結(jié)果卻是100。 這里行為就產(chǎn)生了分歧。

// 違背 LSP
class Rectangle {
    protected int m_width;
    protected int m_height;

    public void setWidth(int width) {
        m_width = width;
    }

    public void setHeight(int height) {
        m_height = height;
    }

    public int getWidth() {
        return m_width;
    }

    public int getHeight() {
        return m_height;
    }

    public int getArea() {
        return m_width * m_height;
    }
}

class Square extends Rectangle {
    public void setWidth(int width) {
        m_width = width;
        m_height = width;
    }

    public void setHeight(int height) {
        m_width = height;
        m_height = height;
    }
}
class LspTest {
    private static Rectangle getNewRectangle() {
        // 假設(shè)這是由一個(gè)工廠來生產(chǎn)的
        return new Square();
    }

    public static void main(String[] args) {
        Rectangle r = LspTest.getNewRectangle();
        r.setHeight(10);
        r.setWidth(5);
        // 用戶知道這是一個(gè)長方形, 會(huì)以為自己能夠分別設(shè)置長和寬
        // 并且期望得到 長 * 寬 的結(jié)果, 然后就懵逼了
        System.out.print(r.getArea());

    }

結(jié)論

里氏替換原則是對(duì)開放-關(guān)閉原則的擴(kuò)展,它要求我們必須確保新添加的子類在擴(kuò)展基類功能的同時(shí)不會(huì)改變它們的行為。

上一篇:單一職責(zé)原則
目錄: http://www.lxweimin.com/p/af861220a6cc

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 單一職責(zé)原則 (SRP) 全稱 SRP , Single Responsibility Principle 單一職...
    米莉_L閱讀 1,797評(píng)論 2 5
  • 面向?qū)ο蟮?個(gè)基本要素: 封裝、繼承、多態(tài) 面向?qū)ο蟮?個(gè)基本設(shè)計(jì)原則: 單一職責(zé)原則(Single-Respos...
    badcyc閱讀 904評(píng)論 0 4
  • 轉(zhuǎn)載標(biāo)注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設(shè)計(jì)模式六...
    Bloo_m閱讀 739評(píng)論 0 7
  • 做后臺(tái)產(chǎn)品的時(shí)候,為了避免設(shè)計(jì)地凌亂,想了解一些系統(tǒng)設(shè)計(jì)模式思想,于是找高內(nèi)聚低耦合相關(guān)的文章。這篇文章是摘自網(wǎng)友...
    徐薇薇閱讀 2,221評(píng)論 0 0
  • 設(shè)計(jì)模式六大原則 設(shè)計(jì)模式六大原則(1):單一職責(zé)原則 定義:不要存在多于一個(gè)導(dǎo)致類變更的原因。通俗的說,即一個(gè)類...
    viva158閱讀 784評(píng)論 0 1