面向?qū)ο蟮脑瓌t里氏替換原則

里氏替換原則

里氏替換原則的英文全稱是Liskov Substitution Principle在刺,縮寫是LSP义屏。

LSP第一種定義是:如果對(duì)每一個(gè)類型的為S的對(duì)象O1闻坚,都有類型為T的對(duì)象O2,使得以T定義的所有程序P在所有對(duì)象O1都替換成O2時(shí)路操,程序P的行為不會(huì)發(fā)生變化徘禁,那么類型S是類型T的子類型诅诱。這不太好理解。

LSP的第二種定義是:所有引用基類的地方必須能透明地使用其子類的對(duì)象送朱。通俗的講就是:只要父類能出現(xiàn)的地方子類就可以出現(xiàn)娘荡,而且替換為子類也不會(huì)產(chǎn)生任何錯(cuò)誤或者異常,使用者可能根本就不需要知道是父類還是子類骤菠,但是,反過(guò)來(lái)就不行了疤孕,有子類出現(xiàn)的地方商乎,父類未必就能適應(yīng)。因?yàn)樽宇愑械臇|西父類不一定有祭阀。

說(shuō)了這么多鹉戚,最終總結(jié)就兩個(gè)字:抽象。為了便于理解這個(gè)原則专控,我們寫了一個(gè)簡(jiǎn)單示例來(lái)描述抹凳,先看UML圖:

里氏替換原則.png

再來(lái)看看具體的代碼:

/**
 * 窗口類
 */
public class Window  {

    public show(View chile) {
        chile.draw();
    }
}

/**
 * 建立視圖抽象,測(cè)量視圖的寬高為公用代碼伦腐,繪制實(shí)現(xiàn)交給具體的子類
 */
public abstract class View {
    public abstract void draw();
    public void measure(int width,int height) {
    }
}

/**
 * Button的具體實(shí)現(xiàn)
 */
public class Button extends View {

    @Override
    public void draw() {
        //繪制Button
    }
}

/**
 * TextView的具體實(shí)現(xiàn)
 */
public class TextView extends View {

    @Override
    public void draw() {
        //繪制TextV
    }
}

上述示例中赢底,Window依賴于View,而View定義了一個(gè)視圖抽象,measure是各個(gè)子類共享的方法幸冻,子類通過(guò)覆寫View的draw方法實(shí)現(xiàn)各自的功能粹庞。任何繼承自View的子類都可以設(shè)置給Window的show方法,這就是里氏替換原則洽损。通過(guò)里氏替換庞溜,就可以自定義各自各樣的view,然后傳遞個(gè)Window碑定,Window負(fù)責(zé)組織view流码,并且將View顯示到屏幕上。

里氏替換原則的核心是抽象延刘,抽象又依賴于繼承這個(gè)特性漫试,在OOP當(dāng)中,繼承的優(yōu)缺點(diǎn)都相當(dāng)?shù)拿黠@访娶。優(yōu)點(diǎn)為:

  • 代碼重用商虐,減少創(chuàng)建的成本,每個(gè)子類擁有父類的方法和屬性
  • 子類和父類基本相似崖疤,但又與父類有所區(qū)別
  • 提高代碼的可擴(kuò)展性,實(shí)現(xiàn)父類的方法就可以了秘车,很多開源框架的擴(kuò)展接口都是通過(guò)繼承父類完成的。
  • 提高產(chǎn)品或項(xiàng)目的開放性劫哼。

繼承的缺點(diǎn):

  • 繼承是侵入性的叮趴,只要繼承就必須擁有父類的所有屬性和方法
  • 可能造成子類代碼冗余、靈活性降低权烧,因?yàn)樽宇惐仨殦碛懈割惖膶傩院头椒?/li>
  • 增強(qiáng)了耦合性眯亦。當(dāng)父類的常量、變量和方法被修改時(shí)般码,必須考慮子類的修改妻率,而且在缺乏規(guī)范的環(huán)境下,這種修好可能帶來(lái)非常糟糕的結(jié)果---大片的代碼需要重構(gòu)板祝。

結(jié)束

開閉原則中的示例圖片緩存系統(tǒng)也很好地反應(yīng)了里氏替換原則宫静,即MemoryCache、DiskCache券时、DoubleCache都可以替換成ImageCache的工作孤里,并保證行為的正確性。實(shí)際中橘洞,開閉原則和里氏替換原則往往是相互關(guān)聯(lián)的捌袜,通過(guò)里氏替換來(lái)達(dá)到擴(kuò)展開放、修改關(guān)閉的效果炸枣。然而虏等,這兩個(gè)原則都強(qiáng)調(diào)一個(gè)OOP的重要特性--抽象弄唧。

參考書籍

《Android源碼設(shè)計(jì)模式》 何紅輝、關(guān)愛(ài)民著

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末博其,一起剝皮案震驚了整個(gè)濱河市套才,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慕淡,老刑警劉巖背伴,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異峰髓,居然都是意外死亡傻寂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門携兵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疾掰,“玉大人,你說(shuō)我怎么就攤上這事徐紧【裁剩” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵并级,是天一觀的道長(zhǎng)拂檩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嘲碧,這世上最難降的妖魔是什么稻励? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮愈涩,結(jié)果婚禮上望抽,老公的妹妹穿的比我還像新娘。我一直安慰自己履婉,他們只是感情好煤篙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著毁腿,像睡著了一般辑奈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狸棍,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天身害,我揣著相機(jī)與錄音味悄,去河邊找鬼草戈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侍瑟,可吹牛的內(nèi)容都是我干的唐片。 我是一名探鬼主播丙猬,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼费韭!你這毒婦竟也來(lái)了茧球?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤星持,失蹤者是張志新(化名)和其女友劉穎抢埋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體督暂,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揪垄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逻翁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饥努。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖八回,靈堂內(nèi)的尸體忽然破棺而出酷愧,到底是詐尸還是另有隱情,我是刑警寧澤缠诅,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布溶浴,位于F島的核電站,受9級(jí)特大地震影響滴铅,放射性物質(zhì)發(fā)生泄漏戳葵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一汉匙、第九天 我趴在偏房一處隱蔽的房頂上張望拱烁。 院中可真熱鬧,春花似錦噩翠、人聲如沸戏自。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)擅笔。三九已至,卻和暖如春屯援,著一層夾襖步出監(jiān)牢的瞬間猛们,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工狞洋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弯淘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓吉懊,卻偏偏與公主長(zhǎng)得像庐橙,于是被迫代替她去往敵國(guó)和親假勿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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