設計模式之美07 裡式替換原則

2021-10-08 18:40:57 字數 1651 閱讀 5423

子類可以替換程式中任何地方的父類, 並且不影響原有的邏輯及正確性不被改變

例如下面的**, 雖然securitytransporter修改了sendrequest方法, 但是在使用時邏輯沒變, 符合裡式替換原則

public

class

transporter

public response sendrequest

(request request)

}public

class

securitytransporter

extends

transporter

@override

public response sendrequest

(request request)

return

super

.sendrequest

(request);}

}

/

/ 改造後:

public

class

securitytransporter

extends

transporter

request.

addpayload(;

request.

addpayload(;

return

super

.sendrequest

(request);}

}

違背裡式替換原則的**

子類違背父類宣告要實現的功能

父類中提供的sortordersbyamount()訂單排序函式,是按照金額從小到大來給訂單排序的,而子類重寫這個sortordersbyamount()訂單排

序函式之後,是按照建立日期來給訂單排序的。那子類的設計就違背裡式替換原則。

子類違背父類對輸入、輸出、異常的約定

在父類中,某個函式約定:執行出錯的時候返回null;獲取資料為空的時候返回空集合(empty collection)。而子類過載函式之後,實現變

了,執行出錯返回異常(exception),獲取不到資料返回null。那子類的設計就違背裡式替換原則。

在父類中,某個函式約定,輸入資料可以是任意整數,但子類實現的時候,只允許輸入資料是正整數,負數就丟擲,也就是說,子類對輸入的

資料的校驗比父類更加嚴格,那子類的設計就違背了裡式替換原則。

在父類中,某個函式約定,只會丟擲argumentnullexception異常,那子類的設計實現中只允許丟擲argumentnullexception異常,任何其

他異常的丟擲,都會導致子類違背裡式替換原則。

子類違背父類注釋中所羅列的任何特殊說明

父類中定義的withdraw()提現函式的注釋是這麼寫的:「使用者的提現金額不得超過賬戶餘額……」,而子類重寫withdraw()函式之後,針對vip

賬號實現了透支提現的功能,也就是提現金額可以大於賬戶餘額,那這個子類的設計也是不符合裡式替換原則的。

以上便是三種典型的違背裡式替換原則的情況。除此之外,判斷子類的設計實現是否違背裡式替換原則,還有乙個小竅門,那就是拿父類的單

元測試去驗證子類的**。如果某些單元測試執行失敗,就有可能說明,子類的設計實現沒有完全地遵守父類的約定,子類有可能違背了裡式替換原則。

設計原則之里式替換原則

前言 最近降溫很厲害,走在路上呼呼的狂風刮在臉上,讓我無比懷戀家鄉的溫暖。現在要求自己早點休息,所以寫部落格的時間也從午夜變到了上午。今天就來聊一聊裡式替換原則吧 1 裡式替換原則是什麼 關於裡式這次詞語的由來,主要是因為這個原則是以為姓裡的女士提出的,所以叫里式。關於這個原則,在實際開發的時候,就...

二 設計模式 裡式替換原則

黎克特制替換原則由麻省理工學院電腦科學實驗室的裡斯科夫女士,在 1987 年的 物件導向技術的高峰會議 上發表的一篇文章 資料抽象和層次 裡提出來的,她提出 繼承必須確保超類所擁有的性質在子類中仍然成立。一 黎克特制替換原則的作用 黎克特制替換原則是實現開閉原則的重要方式之一。它克服了繼承中重寫父類...

設計模式 依賴倒轉原則和裡式替換原則

依賴倒轉原則原話解釋抽象不應該依賴細節,細節應該依賴物件,也就是要針對介面程式設計,不要對實現程式設計。官方定義兩方面 a.高層模組不應該依賴底層模組,兩個都應該依賴抽象 b.抽象不應該依賴細節,細節應該依賴抽象。對於抽象,所謂依賴了抽象的介面或抽象類就不怕更改,還需要介入介紹裡式替換原則。裡式替換...