設(shè)計(jì)模式的原則

一、單一職責(zé)原則

單一職責(zé)原則:一個(gè)類只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé)?;蛘哒f,就一個(gè)類而言,應(yīng)該只有一個(gè)引起它變化的原因。

單一職責(zé)原則就是說,一個(gè)類不能太不能負(fù)責(zé)太多的功能,再簡(jiǎn)單點(diǎn),就是人的器官,在每個(gè)器官的功能職責(zé)是不一樣的,例如心臟就負(fù)責(zé)為人體提供血液,肺代表呼吸,在軟件開發(fā)中,一個(gè)類(大到模塊,小到方法)承擔(dān)的職責(zé)越多,它被復(fù)用的可能性就越小,而且一個(gè)類承擔(dān)的職責(zé)過多,就相當(dāng)于將這些職責(zé)耦合在一起,當(dāng)其中一個(gè)職責(zé)變化時(shí),可能會(huì)影響其他職責(zé)的運(yùn)作,因此要將這些職責(zé)進(jìn)行分離,將不同的職責(zé)封裝在不同的類中,就像我們前端在開發(fā)頁面的時(shí)候,進(jìn)行頁面的組件化拆分,把顆粒度減少,每個(gè)頁面組件都負(fù)責(zé)不同的工作。

demo:

從demo上可以知道People類中,承擔(dān)的太多的職責(zé)了,又要供血,又要吃東西。因此應(yīng)該對(duì)People這個(gè)類進(jìn)行拆分,People可以拆分為一下:

  • Heart: 負(fù)責(zé)供血,包含supplyBlood()方法

  • Lung: 負(fù)責(zé)呼吸,包含breathe()方法

  • People: 負(fù)責(zé)走路和吃,包含eat()和walk()

二、開閉原則

開閉原則:盡量在不修改原有代碼的情況下進(jìn)行擴(kuò)展功能。

demo:

在該demo中,如果需要增加一個(gè)新的類,如人妖 Hemophrodite,則需要修改People類的say()方法的代碼,增加新的判斷邏輯,原則告訴我們要對(duì)修改關(guān)閉,所以這份代碼違反了開閉原則。

可以通過抽象的方式對(duì)代碼進(jìn)行重構(gòu),增加新的類時(shí)無須修改源代碼,滿足開閉原則。做法如下:

  • 增加一個(gè)抽象人類AbstractPeople,將各種具體的人類作為子類。

  • PeopleSay針對(duì)抽象人類進(jìn)行編程,由客戶端來進(jìn)行做哪一類人。


若此時(shí)需要用一個(gè)人要,僅需擴(kuò)展一個(gè) Hemophrodite 類,將 Hemophrodite 也作為 AbstractPeople 的子類即可,且無需修改其他代碼。這種對(duì)擴(kuò)展開放,對(duì)修改封閉就是屬于開閉原則。

demo:

三、里氏代換原則

里氏代換原則:所有引用基類(父類)的地方必須能透明地使用其子類的對(duì)象。

里氏代換原則告訴我們,在軟件中將一個(gè)基類對(duì)象替換成它的子類對(duì)象,程序?qū)⒉粫?huì)產(chǎn)生任何錯(cuò)誤和異常,反過來則不成立,如果一個(gè)軟件實(shí)體使用的是一個(gè)子類對(duì)象的話,那么它不一定能夠使用基類對(duì)象。例如:我喜歡人,那我一定喜歡女人,因?yàn)榕耸侨说淖宇?;但是我喜歡女人,不能據(jù)此斷定我喜歡人,因?yàn)槲也⒉幌矚g人妖或者男人,雖然他們也是人。

四、依賴倒轉(zhuǎn)原則

依賴倒轉(zhuǎn)原則:抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴于抽象。換言之,要針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程。簡(jiǎn)單來說,設(shè)計(jì)代碼之前,先不要考慮什么算法之類的實(shí)現(xiàn)功能,應(yīng)該注重怎么利用類和方法來描述好功能的實(shí)現(xiàn)。

五、隔離原則

接口隔離原則:使用多個(gè)專門的接口,而不使用單一的總接口,即客戶端不應(yīng)該依賴那些它不需要的接口。

這個(gè)原則的意思是:使用多個(gè)隔離的接口,比使用單個(gè)接口要好。它還有另一個(gè)意思是:降低類之間的耦合度。由此可見,其實(shí)設(shè)計(jì)模式就是從大型軟件架構(gòu)出發(fā)、便于升級(jí)和維護(hù)的軟件設(shè)計(jì)思想,它強(qiáng)調(diào)降低依賴,降低耦合。

六、合成復(fù)用原則

合成復(fù)用原則:盡量使用對(duì)象組合,而不是繼承來達(dá)到復(fù)用的目的。

七、迪米特法則

迪米特法則:一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用。

如果一個(gè)系統(tǒng)符合迪米特法則,那么當(dāng)其中某一個(gè)模塊發(fā)生修改時(shí),就會(huì)盡量少地影響其他模塊,擴(kuò)展會(huì)相對(duì)容易。迪米特法則可降低系統(tǒng)的耦合度,使類與類之間保持松散的耦合關(guān)系。



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容