面向对象五个基本原则
軟件開發(fā)中需要知道基本概念,由羅伯特·C·馬丁(Robert C. Martin)于《敏捷軟件開發(fā):原則、模式和實(shí)踐》一書中給出的。在此記錄。
目錄
一.單一職責(zé)原則
二.開放封閉原則
三.?里氏替換原則
四.接口分離原則
五.依賴倒置原則
一.單一職責(zé)原則
一個(gè)類,只有一個(gè)引起它變化的原因。應(yīng)該只有一個(gè)職責(zé)。每一個(gè)職責(zé)都是變化的一個(gè)軸線,如果一個(gè)類有一個(gè)以上的職責(zé),這些職責(zé)就耦合在了一起。這會(huì)導(dǎo)致脆弱的設(shè)計(jì)。當(dāng)一個(gè)職責(zé)發(fā)生變化時(shí),可能會(huì)影響其它的職責(zé)。另外,多個(gè)職責(zé)耦合在一起,會(huì)影響復(fù)用性。
如果一個(gè)類承擔(dān)的職責(zé)過多,就等于把這些職責(zé)耦合在一起了。一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類完成其他職責(zé)的能力。這種耦合會(huì)導(dǎo)致脆弱的設(shè)計(jì),當(dāng)發(fā)生變化時(shí),設(shè)計(jì)會(huì)遭受到意想不到的破壞。而如果想要避免這種現(xiàn)象的發(fā)生,就要盡可能的遵守單一職責(zé)原則。此原則的核心就是解耦和增強(qiáng)內(nèi)聚性。
問題理解
T負(fù)責(zé)兩個(gè)不同的職責(zé):職責(zé)P1,職責(zé)P2。當(dāng)由于職責(zé)P1需求發(fā)生改變而需要修改類T時(shí),有可能會(huì)導(dǎo)致原本運(yùn)行正常的職責(zé)P2功能發(fā)生故障。也就是說職責(zé)P1和P2被耦合在了一起。
解決辦法
遵守單一職責(zé)原則,將不同的職責(zé)封裝到不同的類或模塊中。
二.開放封閉原則
關(guān)于開放封閉原則,其核心的思想是:
軟件實(shí)體應(yīng)該是可擴(kuò)展,而不可修改的。也就是說,對(duì)擴(kuò)展是開放的,而對(duì)修改是封閉的。
因此,開放封閉原則主要體現(xiàn)在兩個(gè)方面:
對(duì)擴(kuò)展開放,意味著有新的需求或變化時(shí),可以對(duì)現(xiàn)有代碼進(jìn)行擴(kuò)展,以適應(yīng)新的情況。
對(duì)修改封閉,意味著類一旦設(shè)計(jì)完成,就可以獨(dú)立完成其工作,而不要對(duì)類進(jìn)行任何修改。
“需求總是變化”、“世界上沒有一個(gè)軟件是不變的”,這些言論是對(duì)軟件需求最經(jīng)典的表白。從中透射出一個(gè)關(guān)鍵的意思就是,對(duì)于軟件設(shè)計(jì)者來說,必須在不需要對(duì)原有的系統(tǒng)進(jìn)行修改的情況下,實(shí)現(xiàn)靈活的系統(tǒng)擴(kuò)展。而如何能做到這一點(diǎn)呢?
只有依賴于抽象。實(shí)現(xiàn)開放封閉的核心思想就是對(duì)抽象編程,而不對(duì)具體編程,因?yàn)槌橄笙鄬?duì)穩(wěn)定。讓類依賴于固定的抽象,所以對(duì)修改就是封閉的;而通過面向?qū)ο蟮睦^承和對(duì)多態(tài)機(jī)制,可以實(shí)現(xiàn)對(duì)抽象體的繼承,通過覆寫其方法來改變固有行為,實(shí)現(xiàn)新的擴(kuò)展方法,所以對(duì)于擴(kuò)展就是開放的。這是實(shí)施開放封閉原則的基本思路,同時(shí)這種機(jī)制是建立在兩個(gè)基本的設(shè)計(jì)原則的基礎(chǔ)上,這就是Liskov替換原則和合成/聚合復(fù)用原則。
三.?里氏替換原則
里氏替換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計(jì)的基本原則之一。 里氏替換原則中說,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。 LSP是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類,軟件單位的功能不受到影響時(shí),基類才能真正被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。
- 子類必須實(shí)現(xiàn)父類的抽象方法,但不得重寫(覆蓋)父類的非抽象(已實(shí)現(xiàn))方法。
- 子類中可以增加自己特有的方法。
- 當(dāng)子類覆蓋或?qū)崿F(xiàn)父類的方法時(shí),方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松。
- 當(dāng)子類的方法實(shí)現(xiàn)父類的抽象方法時(shí),方法的后置條件(即方法的返回值)要比父類更嚴(yán)格。
四.接口分離原則
接口分離原則指在設(shè)計(jì)時(shí)采用多個(gè)與特定客戶類有關(guān)的接口比采用一個(gè)通用的接口要好。即,一個(gè)類要給多個(gè)客戶使用,那么可以為每個(gè)客戶創(chuàng)建一個(gè)接口,然后這個(gè)類實(shí)現(xiàn)所有的接口;而不要只創(chuàng)建一個(gè)接口,其中包含所有客戶類需要的方法,然后這個(gè)類實(shí)現(xiàn)這個(gè)接口。
如果不使用接口分離:
?如果Client A類需要改變所使用的Service接口中的方法,那么不但要改動(dòng)Service接口和ServiceImp類,還要對(duì)ClientB類和ClientC類重新編譯。
五.依賴倒置原則
依賴倒置原則(Dependence Inversion Principle)是程序要依賴于抽象接口,不要依賴于具體實(shí)現(xiàn)。簡單的說就是要求對(duì)抽象進(jìn)行編程,不要對(duì)實(shí)現(xiàn)進(jìn)行編程,這樣就降低了客戶與實(shí)現(xiàn)模塊間的耦合。
面向過程的開發(fā),上層調(diào)用下層,上層依賴于下層,當(dāng)下層劇烈變動(dòng)時(shí)上層也要跟著變動(dòng),這就會(huì)導(dǎo)致模塊的復(fù)用性降低而且大大提高了開發(fā)的成本。
面向?qū)ο蟮拈_發(fā)很好的解決了這個(gè)問題,一般情況下抽象的變化概率很小,讓用戶程序依賴于抽象,實(shí)現(xiàn)的細(xì)節(jié)也依賴于抽象。即使實(shí)現(xiàn)細(xì)節(jié)不斷變動(dòng),只要抽象不變,客戶程序就不需要變化。這大大降低了客戶程序與實(shí)現(xiàn)細(xì)節(jié)的耦合度。
百度上有一個(gè)代碼示例:例子
總結(jié)
以上是生活随笔為你收集整理的面向对象五个基本原则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2014年中国十大电容器企业排名
- 下一篇: [ Jackson ] 简单使用