設計模式-里氏替換原則

設計模式-里氏替換原則

優(yōu)點

面向?qū)ο蟮恼Z言繼承必不可少的,有如下優(yōu)點

  1. 代碼共享,減少創(chuàng)建類的工作量
  2. 提高代碼的重用性
  3. 提高代碼的可擴展性
  4. 提高代碼的可擴展性
  5. 提高產(chǎn)品代碼的開放性
  6. 繼承侵入性 只要繼承,必須擁有父類的內(nèi)容
  7. 降低代碼的靈活性蔽豺,子類必須擁有父類的屬性和方法
  8. 增強耦合性。

提供規(guī)范

里氏替換原則,為繼承定義規(guī)范嘱蛋。

長方形是不是正方形

正方形是一種特殊的長方形,如果將正方形設計為長方形的子類五续,不符合里氏替換原則
下方有三個類
類圖如下


image

關系如上所示

package demo1;

public class SmartTest {
    /*
     * 長方形的長增加超過寬
     * 
     * @param r
     * */
    
    public void resize(Rectangle r) {
        while (r.getHeight() <= r.getWidth()) {
            r.setHeight(r.getHeight() + 1);
        }
    }
}
package demo1;
/*
 * 定義一個長方形類
 * @author ming
 * */

public class Rectangle {
    protected long width;   // 可以訪問基類繼承而來的洒敏,不能訪問基類本身的,對同包內(nèi)的可見疙驾,并且子類也可見
    protected long height;
    
    public void setWidth(long width) {
        this.width = width;
    }
    
    public long getWidth() {
        return this.width;
    }
    
    public void setHeight(long height) {
        this.height = height;
    }
    
    public long getHeight() {
        return this.height;
    }
}
package demo1;
/*
 * 定義一個正方形類繼承自長方形類
 * 
 * @author ming
 * 
 * */
public class Square extends Rectangle{
    public void setWidth(long width, long height) {
        this.width = width;
        this.height = height;
    }
    
    public long getWidth() {
        return width;
    }
    
    public void setHeight(long height, long width) {
        this.height = height;
        this.width = width;
    }
    
    public long getHeight() {
        return height;
    }
}

在上面的三塊代碼中凶伙,當調(diào)用SmartTest類的resize方法的時候,如果傳入的是父類它碎,那么將會可以的函荣,如果傳入的是子類,正方形扳肛,那么將會不可以的偏竟。
即。上方的為長方形行敞峭,正方形不行踊谋。
所以上面的栗子不符合里氏替換原則。
解決方法旋讹,使用繼承時殖蚕,要遵守里氏替換原則,類B繼承類A時沉迹,不要重寫父類A的方法睦疫,也不能重載父類A的方法。
如果代碼更改如下更改
讓其兩個都共同定義同一個父類即可

其中最上層的類為兩個類的抽象類鞭呕。

改進如下

image
package com.ming;

/*
 * 定義一個四邊形類蛤育,只有get方法set方法
 * @author ming
 * */
public abstract class Quadrangle {
    protected abstract long getWidth();
    protected abstract long getHeight();
}
package com.ming;

public class Rectangle extends Quadrangle {
    private long width;
    private long height;
    
    public void setWidth(long width) {
        this.width = width;
    }
    
    public long getWidth() {
        return this.width;
    }
    
    public void setHeight(long height) {
        this.height = height;
    }
    
    public long getHeight() {
        return this.height;
    }
}
package com.ming;

public class Square extends Quadrangle{
    private long width;
    private long height;
    
    public void setWidth(long width) {
        this.height = width;
        this.width = width;
    }
    
    public long getWidth() {
        return this.,width;
    }
    
    public void setHeight(long height) {
        this.height = height;
        this.width = height;
    }
    
    public long getHeight() {
        return this.height;
    }
}

在上方的圖中,由于兩個為平級關系,所以父類的地方瓦糕,換成子類也都可以底洗。

總結(jié)

里氏替換原則;父類可以的地方咕娄,換成子類也同樣可以亥揖。

為什么要符合

一個栗子

package com.ming2;

public class A {
    public int func1(int a, int b) {
        return a-b;
    }
}
package com.ming2;

public 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;  // 調(diào)用func1
    }
}

在上方中,如果這樣書寫

package com.ming2;

public class Client {
    public static void main(String[] args) {
        B b = new B();
        System.out.println(b.func1(100, 50));
    }
}

就違反了里氏替換原則圣勒,即子類能使用的時候费变,父類也必須能使用。

www.iming.info

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末圣贸,一起剝皮案震驚了整個濱河市挚歧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吁峻,老刑警劉巖昼激,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锡搜,居然都是意外死亡,警方通過查閱死者的電腦和手機瞧掺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門耕餐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辟狈,你說我怎么就攤上這事肠缔。” “怎么了哼转?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵明未,是天一觀的道長。 經(jīng)常有香客問我壹蔓,道長趟妥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任佣蓉,我火速辦了婚禮披摄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勇凭。我一直安慰自己疚膊,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布虾标。 她就那樣靜靜地躺著寓盗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上傀蚌,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天基显,我揣著相機與錄音,去河邊找鬼喳张。 笑死续镇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的销部。 我是一名探鬼主播摸航,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舅桩!你這毒婦竟也來了酱虎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤擂涛,失蹤者是張志新(化名)和其女友劉穎读串,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撒妈,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡恢暖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了狰右。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杰捂。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖棋蚌,靈堂內(nèi)的尸體忽然破棺而出嫁佳,到底是詐尸還是另有隱情,我是刑警寧澤谷暮,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布椅野,位于F島的核電站企孩,受9級特大地震影響纪蜒,放射性物質(zhì)發(fā)生泄漏凿将。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一颊埃、第九天 我趴在偏房一處隱蔽的房頂上張望赌蔑。 院中可真熱鬧,春花似錦竟秫、人聲如沸娃惯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趾浅。三九已至愕提,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皿哨,已是汗流浹背浅侨。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留证膨,地道東北人如输。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像央勒,于是被迫代替她去往敵國和親不见。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 原文鏈接:https://www.zybuluo.com/Tyhj/note/1198744里氏替換原則(Lisk...
    Tyhj閱讀 880評論 0 1
  • 設計模式概述 在學習面向?qū)ο笃叽笤O計原則時需要注意以下幾點:a) 高內(nèi)聚崔步、低耦合和單一職能的“沖突”實際上稳吮,這兩者...
    彥幀閱讀 3,747評論 0 14
  • 2018年4月27日 晴 星期五 昨天晚上下了一場小雨, 今天早上的天氣格外晴朗井濒,起床以后打開窗戶灶似,一股清新的空氣...
    王玉琨爸爸閱讀 144評論 0 1
  • 高鵬云匯處, 大腕匯集時瑞你。 寶地光華滿酪惭, 殷殷求經(jīng)癡。 魏書生在這里用經(jīng)典傳播文化 韓軍在孔乙己中呼喚社會溫暖的回...
    火紅的石榴暖暖閱讀 307評論 0 2
  • 拗句三千未可羞者甲,風騷豈盡讓曹劉春感。 無須詩賦無來處,不許篇章不自由过牙。 李杜時常疏韻改,蘇辛偶爾暗香留纺铭。 春花秋月堪成...
    張成昱閱讀 794評論 3 19