国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于面向?qū)ο蠡A(chǔ)設(shè)計——里氏替換原則

這篇具有很好參考價值的文章主要介紹了基于面向?qū)ο蠡A(chǔ)設(shè)計——里氏替換原則。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

基于面向?qū)ο蠡A(chǔ)設(shè)計——里氏替換原則,設(shè)計模式,設(shè)計模式,里氏替換原則

在Java中,支持抽象和多態(tài)的關(guān)鍵機制之一是繼承。正是使用了繼承,我們才可以創(chuàng)建實現(xiàn)父類中抽象方法的子類。那么,是什么規(guī)則在支配著這種特殊的繼承用法呢?最佳的繼承層次的特征又是什么呢?在什么情況下會使我們創(chuàng)建的類層次結(jié)構(gòu)掉進不符合開閉原則的陷阱中呢?這就是里氏替換原則要解決的問題。

概念

里氏代換原則中說,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。 LSP是繼承復用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。

里氏代換原則是對“開-閉”原則的補充。實現(xiàn)“開-閉”原則的關(guān)鍵步驟就是抽象化。而基類與子類的繼承關(guān)系就是抽象化的具體實現(xiàn),所以里氏代換原則是對實現(xiàn)抽象化的具體步驟的規(guī)范。

簡單的理解為一個軟件實體如果使用的是一個父類,那么一定適用于其子類,而且它察覺不出父類對象和子類對象的區(qū)別。也就是說,軟件里面,把父類都替換成它的子類,程序的行為沒有變化。

子類型必須能夠替換掉它們的父類型。

  • 類的繼承原則:里氏替換原則常用來檢查兩個類是否為繼承關(guān)系。在符合里氏替換原則的繼承關(guān)系中,使用父類代碼的地方,用子類代碼替換后,能夠正確的執(zhí)行動作處理。換句話說,如果子類替換了父類后,不能夠正確執(zhí)行動作,那么他們的繼承關(guān)系就是不正確的,應(yīng)該重新設(shè)計它們之間的關(guān)系。
  • 動作正確性保證:里氏替換原則對子類進行了約束,所以在為已存在的類進行擴展,來創(chuàng)建一個新的子類時,符合里氏替換原則的擴展不會給已有的系統(tǒng)引入新的錯誤。

繼承的優(yōu)缺點

優(yōu)點:
  • 代碼共享,減少創(chuàng)建類的工作量,每個子類都擁有父類的方法和屬性
  • 提高代碼的重用性
  • 子類可以形似父類,但是又異于父類。
  • 提高代碼的可擴展性,實現(xiàn)父類的方法就可以了。許多開源框架的擴展接口都是通過繼承父類來完成。
  • 提高產(chǎn)品或項目的開放性
缺點:
  • 繼承是侵入性的,只要繼承,就必須擁有父類的所有方法和屬性
  • 降低了代碼的靈活性,子類必須擁有父類的屬性和方法,讓子類有了一些約束
  • 增加了耦合性,當父類的常量,變量和方法被修改了,需要考慮子類的修改,這種修改可能帶來非常糟糕的結(jié)果,要重構(gòu)大量的代碼

四層含義

里氏替換原則包含以下4層含義:

  • 子類可以實現(xiàn)父類的抽象方法,但是不能覆蓋父類的非抽象方法。
  • 子類中可以增加自己特有的方法。
  • 當子類覆蓋或?qū)崿F(xiàn)父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松。
  • 當子類的方法實現(xiàn)父類的抽象方法時,方法的后置條件(即方法的返回值)要比父類更嚴格。

【案例】正方形不是長方形。

在數(shù)學領(lǐng)域里,正方形毫無疑問是長方形,它是一個長寬相等的長方形。所以,我們開發(fā)的一個與幾何圖形相關(guān)的軟件系統(tǒng),就可以順理成章的讓正方形繼承自長方形。

基于面向?qū)ο蠡A(chǔ)設(shè)計——里氏替換原則,設(shè)計模式,設(shè)計模式,里氏替換原則

代碼如下:

長方形類(Rectangle):

public class Rectangle {
    private double length;
    private double width;

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }
}

正方形(Square):

由于正方形的長和寬相同,所以在方法setLength和setWidth中,對長度和寬度都需要賦相同值。

public class Square extends Rectangle {
    
    public void setWidth(double width) {
        super.setLength(width);
        super.setWidth(width);
    }

    public void setLength(double length) {
        super.setLength(length);
        super.setWidth(length);
    }
}

類RectangleDemo是我們的軟件系統(tǒng)中的一個組件,它有一個resize方法依賴基類Rectangle,resize方法是RectandleDemo類中的一個方法,用來實現(xiàn)寬度逐漸增長的效果。

public class RectangleDemo {
    
    public static void resize(Rectangle rectangle) {
        while (rectangle.getWidth() <= rectangle.getLength()) {
            rectangle.setWidth(rectangle.getWidth() + 1);
        }
    }

    //打印長方形的長和寬
    public static void printLengthAndWidth(Rectangle rectangle) {
        System.out.println(rectangle.getLength());
        System.out.println(rectangle.getWidth());
    }

    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle();
        rectangle.setLength(20);
        rectangle.setWidth(10);
        resize(rectangle);
        printLengthAndWidth(rectangle);

        System.out.println("============");

        Rectangle rectangle1 = new Square();
        rectangle1.setLength(10);
        resize(rectangle1);
        printLengthAndWidth(rectangle1);
    }
}

我們運行一下這段代碼就會發(fā)現(xiàn),假如我們把一個普通長方形作為參數(shù)傳入resize方法,就會看到長方形寬度逐漸增長的效果,當寬度大于長度,代碼就會停止,這種行為的結(jié)果符合我們的預期;假如我們再把一個正方形作為參數(shù)傳入resize方法后,就會看到正方形的寬度和長度都在不斷增長,代碼會一直運行下去,直至系統(tǒng)產(chǎn)生溢出錯誤。

所以,普通的長方形是適合這段代碼的,正方形不適合。

我們得出結(jié)論:在resize方法中,Rectangle類型的參數(shù)是不能被Square類型的參數(shù)所代替,如果進行了替換就得不到預期結(jié)果。因此,Square類和Rectangle類之間的繼承關(guān)系違反了里氏代換原則,它們之間的繼承關(guān)系不成立,正方形不是長方形。

如何改進呢?此時我們需要重新設(shè)計他們之間的關(guān)系。抽象出來一個四邊形接口(Quadrilateral),讓Rectangle類和Square類實現(xiàn)Quadrilateral接口。

基于面向?qū)ο蠡A(chǔ)設(shè)計——里氏替換原則,設(shè)計模式,設(shè)計模式,里氏替換原則文章來源地址http://www.zghlxwxcb.cn/news/detail-626542.html

到了這里,關(guān)于基于面向?qū)ο蠡A(chǔ)設(shè)計——里氏替換原則的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 設(shè)計模式(四):里氏替換原則(詳解)

    本博主將用CSDN記錄軟件開發(fā)求學之路上親身所得與所學的心得與知識,有興趣的小伙伴可以關(guān)注博主!也許一個人獨行,可以走的很快,但是一群人結(jié)伴而行,才能走的更遠! (1)引入 繼承包含這樣一層含義:父類中凡是已經(jīng)實現(xiàn)好的方法, 實際上是在設(shè)定規(guī)范和契約 ,

    2024年02月05日
    瀏覽(23)
  • 2.python設(shè)計模式【面向?qū)ο笤O(shè)計的SOLID原則 基礎(chǔ)概念】

    概念:一個軟件實體如類、模塊和函數(shù)應(yīng)該對擴展開放,對修改關(guān)閉。即軟件實體應(yīng)該盡量在不修改原有代碼的情況下進行擴展 概念:所有引用父類的地方必須能透明地使用其子類的對象 概念:高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象;抽象不依賴細節(jié);細節(jié)

    2024年02月16日
    瀏覽(25)
  • 設(shè)計原則學習之里氏替換原則

    以下內(nèi)容均來自抖音號【it楠老師教java】的設(shè)計模式課程。 1 、原理概述 子類對象(objectofsubtype/derivedclass)能夠替換程序(program)中父類對象(objectofbase/parentclass)出現(xiàn)的任何地方,并且保證原來程序的邏輯行為(behavior)不變及正確性不被破壞。 2、簡單的示例1 // 基類:

    2024年02月14日
    瀏覽(20)
  • 【設(shè)計模式】面向?qū)ο笤O(shè)計八大原則

    (1)依賴倒置原則(DIP) 高層模塊(穩(wěn)定)不應(yīng)該依賴于低層模塊(變化),二者都應(yīng)該依賴于抽象(穩(wěn)定)。 抽象(穩(wěn)定)不應(yīng)該依賴于變化),實現(xiàn)細節(jié)應(yīng)該依賴于抽象(穩(wěn)定)。 (2)開放封閉原則(OCP) 對擴展開放,對更改封閉。 類模塊應(yīng)該是可擴展的,但是不可

    2024年02月10日
    瀏覽(29)
  • 深入理解設(shè)計原則之里氏替換原則(LSP)【軟件架構(gòu)設(shè)計】

    深入理解設(shè)計原則之里氏替換原則(LSP)【軟件架構(gòu)設(shè)計】

    C++高性能優(yōu)化編程系列 深入理解軟件架構(gòu)設(shè)計系列 深入理解設(shè)計模式系列 高級C++并發(fā)線程編程 里氏替換原則(Liskov Substitution Principle, LSP)于1986年有Barbara Liskov提出,他當時是這樣描述這條原則的: 如果S是T的子類型,那么T的對象可以被S的對象所替換,并不影響代碼的運行

    2024年02月07日
    瀏覽(23)
  • 《設(shè)計模式的藝術(shù)》筆記 - 面向?qū)ο笤O(shè)計原則

    1、單一職責原則 ? ? ? ? 一個類只負責單一功能領(lǐng)域中的相應(yīng)職責。 2、開閉原則 ? ? ? ? 一個軟件實體應(yīng)當對擴展開放,對修改關(guān)閉。即軟件實體應(yīng)當盡量在不修改原有代碼的情況下進行擴展。 3、里氏代換原則 ? ? ? ? 所有引用基類的地方必須能透明地使用其子類的對

    2024年01月21日
    瀏覽(23)
  • C++設(shè)計模式_02_面向?qū)ο笤O(shè)計原則

    變化是復用的天敵!面向?qū)ο笤O(shè)計或者說使用了抽象原則的面向?qū)ο笤O(shè)計最大的優(yōu)勢在于#

    2024年02月11日
    瀏覽(21)
  • 一網(wǎng)打盡java注解-克隆-面向?qū)ο笤O(shè)計原則-設(shè)計模式

    一網(wǎng)打盡java注解-克隆-面向?qū)ο笤O(shè)計原則-設(shè)計模式

    注解 :也叫標注,用于包、類、變量、方法、參數(shù)上??梢酝ㄟ^反射獲取標注??梢栽诰幾g期間使用,也可以被編譯到字節(jié)碼文件中,運行時生效。 內(nèi)置注解 :Java語言已經(jīng)定義好的注解。 @Overread :用于方法重寫。 @Deprecated :標記過時方法。 @SuppressWarnings :指示編譯器去

    2024年02月11日
    瀏覽(20)
  • 設(shè)計模式:里氏代換原則(Liskov Substitution Principle,LSP)介紹

    里氏代換原則(Liskov Substitution Principle,LSP)是面向?qū)ο笤O(shè)計原則的一部分,它強調(diào) 子類對象應(yīng)該能夠替換其父類對象而不影響程序的正確性 。換句話說,子類對象應(yīng)該可以在不改變程序正確性的前提下替換掉父類對象。 該原則的實現(xiàn)原理可以通過以下幾點來說明: 子類必

    2024年04月29日
    瀏覽(15)
  • 里氏替換原則究竟如何理解?

    介 紹 里 氏 替 換 原 則 的 文 章 非 常 多 , 但 可 能 大 家 看 完 之 后 , 心 中 仍 然 留 有 疑 問 , 如 何 去 落 地 實 現(xiàn) , 如 何 判 斷 是 否 影 響 程 序 功 能 。 本 文 將 帶 領(lǐng) 大 家 深 入 理 解 里 氏 替 換 , 一 起 領(lǐng) 略 下 它 的 真 正 面 目 。 但 在 此 之 前 , 有 必

    2024年02月08日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包