理解Java設(shè)計(jì)模式編程中的迪米特原則
定義:一個(gè)對象應(yīng)該對其他對象保持最少的了解。
問題由來:類與類之間的關(guān)系越密切,耦合度越大,當(dāng)一個(gè)類發(fā)生改變時(shí),對另一個(gè)類的影響也越大。
解決方案:盡量降低類與類之間的耦合。
自從我們接觸編程開始,就知道了軟件編程的總的原則:低耦合,高內(nèi)聚。無論是面向過程編程還是面向?qū)ο缶幊蹋挥惺垢鱾€(gè)模塊之間的耦合盡量的低,才能提高代碼的復(fù)用率。低耦合的優(yōu)點(diǎn)不言而喻,但是怎么樣編程才能做到低耦合呢?那正是迪米特法則要去完成的。
迪米特法則又叫最少知道原則,最早是在1987年由美國Northeastern University的Ian Holland提出。通俗的來講,就是一個(gè)類對自己依賴的類知道的越少越好。也就是說,對于被依賴的類來說,無論邏輯多么復(fù)雜,都盡量地的將邏輯封裝在類的內(nèi)部,對外除了提供的public方法,不對外泄漏任何信息。迪米特法則還有一個(gè)更簡單的定義:只與直接的朋友通信。首先來解釋一下什么是直接的朋友:每個(gè)對象都會(huì)與其他對象有耦合關(guān)系,只要兩個(gè)對象之間有耦合關(guān)系,我們就說這兩個(gè)對象之間是朋友關(guān)系。耦合的方式很多,依賴、關(guān)聯(lián)、組合、聚合等。其中,我們稱出現(xiàn)成員變量、方法參數(shù)、方法返回值中的類為直接的朋友,而出現(xiàn)在局部變量中的類則不是直接的朋友。也就是說,陌生的類最好不要作為局部變量的形式出現(xiàn)在類的內(nèi)部。
下面是一個(gè)違反迪米特原則的例子:
public class Teacher { public void teach(Classes classes){ classes.getStudents.getScore.show(); } }
存在什么問題呢?耦合性太高。
1. Student 類中可能會(huì)取消Score類。
2. Score類的show方法也可能會(huì)被刪除。
Student類,Score類對于你來說都是陌生的,當(dāng)他們改變時(shí),你可能都不知道。
我們可以修改成:
public class Teacher { public void teach(Classes classes){ classes.showScore(); } } public class Classes { public void showScore(Student student){ student.showScore(); } } public class Student { Score score; public void showScore(){ score = new Score(80); score.show(); } }
總結(jié):
1. 迪米特法則的優(yōu)點(diǎn)在于降低類之間的耦合。
2. 缺點(diǎn)是會(huì)產(chǎn)生比較多的小方法,讓系統(tǒng)變得比較凌亂,而且通信效率會(huì)降低。
3. 設(shè)計(jì)模式中的應(yīng)用:門面模式(Facade Pattern)和中介模式(Mediator Pattern)。
相關(guān)文章
Jmeter多臺(tái)機(jī)器并發(fā)請求實(shí)現(xiàn)壓力性能測試
這篇文章主要介紹了Jmeter多臺(tái)機(jī)器并發(fā)請求實(shí)現(xiàn)壓力性能測試,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10深入了解Java設(shè)計(jì)模式之職責(zé)鏈模式
Java設(shè)計(jì)模式中有很多種類別,例如單例模式、裝飾模式、觀察者模式等。本文將為大家詳細(xì)介紹其中的職責(zé)鏈模式,感興趣的可以了解一下2022-09-09Java引用傳遞和值傳遞棧內(nèi)存與堆內(nèi)存的指向操作
這篇文章主要介紹了Java引用傳遞和值傳遞棧內(nèi)存與堆內(nèi)存的指向操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java應(yīng)用服務(wù)器之tomcat會(huì)話復(fù)制集群配置的示例詳解
這篇文章主要介紹了Java應(yīng)用服務(wù)器之tomcat會(huì)話復(fù)制集群配置的相關(guān)知識,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07基于params、@PathVariabl和@RequestParam的用法與區(qū)別說明
這篇文章主要介紹了方法參數(shù)相關(guān)屬性params、@PathVariabl和@RequestParam用法與區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08學(xué)習(xí)在一臺(tái)新電腦上配置JAVA開發(fā)環(huán)境
本文主要介紹了如何在一臺(tái)新電腦上配置JAVA開發(fā)環(huán)境,每一個(gè)步驟都有對應(yīng)的截圖和文字說明,需要的朋友可以參考下2015-07-07JAVA演示阿里云圖像識別API,印刷文字識別-營業(yè)執(zhí)照識別
最近有由于工作需要,開始接觸阿里云的云市場的印刷文字識別API-營業(yè)執(zhí)照識別這里我加上了官網(wǎng)的申請說明,只要你有阿里云賬號就可以用,前500次是免費(fèi)的,API說明很簡陋,只能做個(gè)簡單參考2019-05-05