设计模式(面向对象)设计的七大原则
聲明:本人設(shè)計(jì)模式模塊是集合網(wǎng)上資料和老師課件總結(jié)的知識(shí)點(diǎn),如本博客有侵權(quán),本人即刻刪。
設(shè)計(jì)模式(面向?qū)ο笤O(shè)計(jì))原則,分別是:
1.開(kāi)放封閉原則:對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉
2.單一職責(zé)原則:一個(gè)類只做一件事情
3.依賴倒轉(zhuǎn)原則:采用接口編程
4.迪米特法則(最小知識(shí)原則):高內(nèi)聚 、低耦合
5.接口隔離原則:細(xì)節(jié)接口
6.合成/聚合復(fù)用原則:避免使用繼承
7.里氏代換原則:子類不能去修改父類的功能
1、開(kāi)放封閉原則
概念:一個(gè)軟件實(shí)體如類、模板、和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放、對(duì)修改關(guān)閉。模塊應(yīng)該在盡量不修改源代碼的情況下進(jìn)行擴(kuò)展。
在軟件周期內(nèi),因?yàn)樽兓⑸?jí)和維護(hù)等原因需要對(duì)軟件原有代碼進(jìn)行修改時(shí),可能會(huì)給代碼引入錯(cuò)誤,也可能會(huì)使我們不得不對(duì)整個(gè)功能進(jìn)行重構(gòu),并且需要原有代碼經(jīng)過(guò)重新測(cè)試。當(dāng)軟件需求變化時(shí),盡量通過(guò)擴(kuò)展軟件實(shí)體的行為來(lái)實(shí)現(xiàn)變化,而不是通過(guò)修改已有代碼來(lái)實(shí)現(xiàn)變化。
開(kāi)放封閉原則是面向?qū)ο笤O(shè)計(jì)的核心所在,遵循這個(gè)原則可以帶來(lái)面向?qū)ο蠹夹g(shù)所聲稱的巨大好處,也就是可維護(hù)、可擴(kuò)展、可復(fù)用、靈活性好。開(kāi)發(fā)人員應(yīng)該僅對(duì)程序中呈現(xiàn)的頻繁變化的那些部分作出抽象。
2、單一職責(zé)原則
概念:就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因。
當(dāng)我們?cè)谧鼍幊痰臅r(shí)候,很自然的回個(gè)一個(gè)類加上各種各樣的功能。這樣意味著,無(wú)論任何需求要來(lái),你都需要更改這個(gè)類,這樣其實(shí)是很糟糕的,維護(hù)麻煩,復(fù)用不可能,也缺乏靈活性。如果一個(gè)類承擔(dān)的職責(zé)過(guò)多,就等于把這些職責(zé)耦合起來(lái),一個(gè)職責(zé)變化可能會(huì)削弱或者抑制這個(gè)類完成其他職責(zé)的能力。這種耦合會(huì)導(dǎo)致脆弱的設(shè)計(jì),當(dāng)變化發(fā)生時(shí),設(shè)計(jì)會(huì)遭到很多意想不到的破壞。
3、依賴倒轉(zhuǎn)原則
概念:依賴倒轉(zhuǎn)原則是程序要依賴于抽象接口,不要依賴于具體實(shí)現(xiàn)。簡(jiǎn)單的來(lái)說(shuō)就是要求對(duì)抽象進(jìn)行編程,不要對(duì)實(shí)現(xiàn)進(jìn)行編程,這樣就降低了客戶與實(shí)現(xiàn)模塊的耦合。
有時(shí)候?yàn)榱舜a復(fù)用,一般會(huì)把常用的代碼寫(xiě)成函數(shù)或類庫(kù)。這樣開(kāi)發(fā)新項(xiàng)目的時(shí)候直接用就行了。比如做項(xiàng)目的時(shí)候大多要訪問(wèn)數(shù)據(jù)庫(kù),所以我們把訪問(wèn)數(shù)據(jù)庫(kù)的代碼寫(xiě)成了函數(shù)。每次做項(xiàng)目去調(diào)用這些函數(shù)。那么問(wèn)題來(lái)了,我們要做新項(xiàng)目的時(shí)候,發(fā)現(xiàn)業(yè)務(wù)邏輯高層模塊都是一樣的,但客戶卻希望使用不同的數(shù)據(jù)庫(kù)或存儲(chǔ)方式,這時(shí)就出現(xiàn)了麻煩。我們希望能再次利用這些高層模塊,但是高層模塊都是與低層的訪問(wèn)數(shù)據(jù)庫(kù)綁定在一起,沒(méi)辦法復(fù)用這些高層的模塊。所以不管是高層模塊和底層模塊都應(yīng)該依賴于抽象,具體一點(diǎn)就是接口或者抽象類,只要接口是穩(wěn)定的,那么任何一個(gè)更改都不用擔(dān)心。
4、迪米特法則(最小知識(shí)原則)
概念:一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能的少與其他實(shí)體發(fā)生相互作用。一個(gè)軟件單位對(duì)其他軟件單位都只有最少的知識(shí),而且局限于那些與本單位密切相關(guān)的軟件單位。迪米特法則的初衷在于降低類之間的耦合。由于每個(gè)類盡量減少對(duì)其他類的依賴,因此,很容易使得系統(tǒng)的功能模塊功能獨(dú)立,相互之間不存在(或很少有)依賴關(guān)系。迪米特法則不希望類之間建立直接的聯(lián)系。如果有真的需要建立聯(lián)系的,也希望能通過(guò)他的友元類來(lái)轉(zhuǎn)達(dá)。因此,應(yīng)用迪米特法則有可能造成一個(gè)后果就是:系統(tǒng)中存在大量的中介類,這些類之所以存在完全是為了傳遞類之間的相互關(guān)系,這在一定程度上增加了系統(tǒng)的復(fù)雜度。
5、接口隔離原則
概念:客戶端不應(yīng)該依賴他不需要的接口,類間的依賴關(guān)系應(yīng)建立在最小的接口上。
接口隔離原則的核心定義,不出現(xiàn)臃腫的接口,但是“小”是有限度的,首先就是不能違反單一職責(zé)原則。
6、合成/聚合復(fù)用原則
概念:合成/聚合復(fù)用原則經(jīng)常又叫做合成復(fù)用原則,就是在一個(gè)新的對(duì)象里面使用一些已有的對(duì)象,使之成為新對(duì)象的一部分,新的對(duì)象通過(guò)這些對(duì)象的委派達(dá)到復(fù)用已有功能的目的。他的設(shè)計(jì)原則是:要盡量使用合成/聚合,盡量不要使用繼承。
7、里氏代換原則
概念:里氏代換原則是面向?qū)ο笤O(shè)計(jì)的基本原則之一。即任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。里氏代換原則是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類,軟件單位的功能不受影響時(shí),基類才能被真正復(fù)用,而衍生類也能夠在積累的基礎(chǔ)上增加新的行為,里氏代換原則是對(duì)“開(kāi)-閉”原則的補(bǔ)充。實(shí)現(xiàn)“開(kāi)-閉”原則的關(guān)鍵步驟就是抽象化。在基類與子類的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn),所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。
當(dāng)滿足繼承的時(shí)候,父類肯定存在非私有的成員,子類肯定是得到了父類的這些非私有成員(假設(shè),父類的成員全部是私有的,那么子類沒(méi)辦法從父類繼承任何成員,也就不存在繼承的概念了)。既然子類繼承了父類的這些非私有成員,那么子類對(duì)象也就可以在父類對(duì)象中調(diào)用這些非私有成員。所以,子類對(duì)象可以替換父類對(duì)象的位置。
在里氏帶環(huán)原則下,當(dāng)需求有變化時(shí),只需繼承,而別的東西不會(huì)改變。由于里氏代換原則才使得開(kāi)放封閉稱為可能。這樣使得子類在父類無(wú)需修改的情況下就可以擴(kuò)展。
總結(jié)
以上是生活随笔為你收集整理的设计模式(面向对象)设计的七大原则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LInux线程——多线程与fork之间的
- 下一篇: 什么是设计模式