最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

舉例解析Java的設(shè)計(jì)模式編程中里氏替換原則的意義

 更新時(shí)間:2016年02月03日 10:41:47   作者:卡奴達(dá)摩  
這篇文章主要介紹了Java的設(shè)計(jì)模式中里氏替換原則的意義,文中舉例來說明里氏替換原則中強(qiáng)調(diào)的繼承特性方面可能帶來的問題,需要的朋友可以參考下

里氏替換原則,OCP作為OO的高層原則,主張使用“抽象(Abstraction)”和“多態(tài)(Polymorphism)”將設(shè)計(jì)中的靜態(tài)結(jié)構(gòu)改為動(dòng)態(tài)結(jié)構(gòu),維持設(shè)計(jì)的封閉性。“抽象”是語言提供的功能?!岸鄳B(tài)”由繼承語義實(shí)現(xiàn)。

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

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

  現(xiàn)在我們可以對以上四層含義進(jìn)行講解。

  子類可以實(shí)現(xiàn)父類的抽象方法,但是不能覆蓋父類的非抽象方法

  在我們做系統(tǒng)設(shè)計(jì)時(shí),經(jīng)常會設(shè)計(jì)接口或抽象類,然后由子類來實(shí)現(xiàn)抽象方法,這里使用的其實(shí)就是里氏替換原則。子類可以實(shí)現(xiàn)父類的抽象方法很好理解,事實(shí)上,子類也必須完全實(shí)現(xiàn)父類的抽象方法,哪怕寫一個(gè)空方法,否則會編譯報(bào)錯(cuò)。

  里氏替換原則的關(guān)鍵點(diǎn)在于不能覆蓋父類的非抽象方法。父類中凡是已經(jīng)實(shí)現(xiàn)好的方法,實(shí)際上是在設(shè)定一系列的規(guī)范和契約,雖然它不強(qiáng)制要求所有的子類必須遵從這些規(guī)范,但是如果子類對這些非抽象方法任意修改,就會對整個(gè)繼承體系造成破壞。而里氏替換原則就是表達(dá)了這一層含義。

  在面向?qū)ο蟮脑O(shè)計(jì)思想中,繼承這一特性為系統(tǒng)的設(shè)計(jì)帶來了極大的便利性,但是由之而來的也潛在著一些風(fēng)險(xiǎn)。下面舉例來說明繼承的風(fēng)險(xiǎn),我們需要完成一個(gè)兩數(shù)相減的功能,由類A來負(fù)責(zé)。

class A{ 
  public int func1(int a, int b){ 
    return a-b; 
  } 
} 
 
public class Client{ 
  public static void main(String[] args){ 
    A a = new A(); 
    System.out.println("100-50="+a.func1(100, 50)); 
    System.out.println("100-80="+a.func1(100, 80)); 
  } 
} 

 運(yùn)行結(jié)果:

100-50=50
100-80=20

        后來,我們需要增加一個(gè)新的功能:完成兩數(shù)相加,然后再與100求和,由類B來負(fù)責(zé)。即類B需要完成兩個(gè)功能:
兩數(shù)相減。
兩數(shù)相加,然后再加100。
        由于類A已經(jīng)實(shí)現(xiàn)了第一個(gè)功能,所以類B繼承類A后,只需要再完成第二個(gè)功能就可以了,代碼如下:

class B extends A{ 
  public int func1(int a, int b){ 
    return a+b; 
  } 
   
  public int func2(int a, int b){ 
    return func1(a,b)+100; 
  } 
} 
 
public class Client{ 
  public static void main(String[] args){ 
    B b = new B(); 
    System.out.println("100-50="+b.func1(100, 50)); 
    System.out.println("100-80="+b.func1(100, 80)); 
    System.out.println("100+20+100="+b.func2(100, 20)); 
  } 
} 

類B完成后,運(yùn)行結(jié)果:

100-50=150
100-80=180
100+20+100=220

        我們發(fā)現(xiàn)原本運(yùn)行正常的相減功能發(fā)生了錯(cuò)誤。原因就是類B在給方法起名時(shí)無意中重寫了父類的方法,造成所有運(yùn)行相減功能的代碼全部調(diào)用了類B重寫后的方法,造成原本運(yùn)行正常的功能出現(xiàn)了錯(cuò)誤。在本例中,引用基類A完成的功能,換成子類B之后,發(fā)生了異常。在實(shí)際編程中,我們常常會通過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,但是整個(gè)繼承體系的可復(fù)用性會比較差,特別是運(yùn)用多態(tài)比較頻繁時(shí),程序運(yùn)行出錯(cuò)的幾率非常大。如果非要重寫父類的方法,比較通用的做法是:原來的父類和子類都繼承一個(gè)更通俗的基類,原有的繼承關(guān)系去掉,采用依賴、聚合,組合等關(guān)系代替。


相關(guān)文章

  • 使用easyexcel導(dǎo)出的excel文件,使用poi讀取時(shí)異常處理方案

    使用easyexcel導(dǎo)出的excel文件,使用poi讀取時(shí)異常處理方案

    這篇文章主要介紹了使用easyexcel導(dǎo)出的excel文件,使用poi讀取時(shí)異常處理方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 一篇文章帶你了解Java容器,面板及四大布局管理器應(yīng)用

    一篇文章帶你了解Java容器,面板及四大布局管理器應(yīng)用

    這篇文章主要介紹了JAVA布局管理器與面板組合代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-08-08
  • IDEA部署Tomcat的超詳細(xì)圖文教程

    IDEA部署Tomcat的超詳細(xì)圖文教程

    最近迫于無奈從我哪破舊的Eclipse轉(zhuǎn)換到了IDEA,然后就是超多的不習(xí)慣,下面這篇文章主要給大家介紹了關(guān)于IDEA部署Tomcat的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • MyBatis實(shí)現(xiàn)批量插入數(shù)據(jù),多重forEach循環(huán)

    MyBatis實(shí)現(xiàn)批量插入數(shù)據(jù),多重forEach循環(huán)

    這篇文章主要介紹了MyBatis實(shí)現(xiàn)批量插入數(shù)據(jù),多重forEach循環(huán)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java基礎(chǔ)--JDK SPI概述

    java基礎(chǔ)--JDK SPI概述

    SPI是一種服務(wù)發(fā)現(xiàn)機(jī)制,本文就SPI做了詳細(xì)概述,具有很好的參考價(jià)值,希望對小伙伴們有所幫助,感興趣的朋友一起來參考參考吧
    2021-08-08
  • 使用Java實(shí)現(xiàn)MapReduce詞頻統(tǒng)計(jì)示例代碼

    使用Java實(shí)現(xiàn)MapReduce詞頻統(tǒng)計(jì)示例代碼

    這篇文章主要介紹了使用Java實(shí)現(xiàn)MapReduce詞頻統(tǒng)計(jì)的相關(guān)資料,通過詞頻統(tǒng)計(jì)示例來展示MapReduce的運(yùn)行機(jī)制,涵蓋了Mapper和Reducer的實(shí)現(xiàn),并說明了如何配置和執(zhí)行MapReduce作業(yè),需要的朋友可以參考下
    2024-11-11
  • Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法

    Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法

    這篇文章主要介紹了Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java基本語法之內(nèi)部類示例詳解

    Java基本語法之內(nèi)部類示例詳解

    本文帶大家認(rèn)識Java基本語法——內(nèi)部類,將一個(gè)類定義放在另一類的定義的內(nèi)部,這個(gè)就是內(nèi)部類,內(nèi)部類允許將一些邏輯相關(guān)的類組織在一起,并能夠控制位于內(nèi)部的類的可視性,感興趣的可以了解一下
    2022-03-03
  • IDEA2020.2.3

    IDEA2020.2.3 "reading maven projects"卡住的問題

    這篇文章主要介紹了IDEA2020.2.3 "reading maven projects"卡住的問題及問題原因探究,通過多種方法給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-10-10
  • SpringBoot整合mybatis使用Druid做連接池的方式

    SpringBoot整合mybatis使用Druid做連接池的方式

    這篇文章主要介紹了SpringBoot整合mybatis使用Druid做連接池的方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評論

桦川县| 巫溪县| 石门县| 木里| 康平县| 磐安县| 固始县| 西昌市| 堆龙德庆县| 县级市| 平阳县| 怀来县| 淳化县| 济源市| 台湾省| 昂仁县| 景洪市| 涿鹿县| 广汉市| 峨眉山市| 登封市| 鹿泉市| 新田县| 仁寿县| 唐海县| 铅山县| 通海县| 满城县| 左云县| 益阳市| 山西省| 岱山县| 文成县| 沧州市| 永善县| 大田县| 广汉市| 株洲市| 莱州市| 阿鲁科尔沁旗| 敦化市|