淺談Java設(shè)計(jì)模式之七大設(shè)計(jì)原則
前言
學(xué)習(xí)設(shè)計(jì)模式的方法:掌握理解七大原則以及其目的,學(xué)習(xí)相應(yīng)的設(shè)計(jì)模式(帶著設(shè)計(jì)目的,應(yīng)用場(chǎng)景(解決什么樣的問題),如何實(shí)現(xiàn)(編碼實(shí)現(xiàn)一個(gè)小例子),優(yōu)缺點(diǎn)是什么?等等)
一、單一職責(zé)原則(SingleResponsibilityPrinciple,SRP)
定義:一個(gè)類只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé)
理解:該設(shè)計(jì)模式很好理解,就是一個(gè)類只實(shí)現(xiàn)某個(gè)領(lǐng)域的相應(yīng)職責(zé),這樣有利于進(jìn)行調(diào)用。就比如在Java開發(fā)時(shí),設(shè)計(jì)controller、service、manager、dao層一樣的道理,進(jìn)行分層分工,再和生活貼近一點(diǎn),人們?cè)谏鐣?huì)中也是更加各有所長(zhǎng)進(jìn)行職責(zé)分工協(xié)調(diào)更好地運(yùn)行社會(huì)。
例子:可能在剛開始學(xué)習(xí)Java進(jìn)行課設(shè)設(shè)計(jì)時(shí),可能會(huì)將DB連接,圖表展示都放在一個(gè)類里面,這樣導(dǎo)致該類就比較冗雜。為了遵循該原則應(yīng)該將其分解為DBUtil和ChartDisplay兩個(gè)類。
二、開閉原則(Open-ClosedPrinciple,OCP)
定義:軟件實(shí)體應(yīng)對(duì)擴(kuò)展開放,而對(duì)修改關(guān)閉
理解:剛開始看到該原則定義,其實(shí)有點(diǎn)懵,然后結(jié)合例子就很容易明白了。其意思就是當(dāng)該類需要進(jìn)行拓展(比如說添加一個(gè)新功能(方法))是可以的,但進(jìn)行修改某功能則不可以。怎么實(shí)現(xiàn)呢?那就得看下個(gè)里氏代換原則了。不過目的還是為了拓展,維護(hù)。
例子:假設(shè)需要展示不同圖表,你采用傳入type參數(shù)去控制展示何種圖表,那么當(dāng)你拓展時(shí),就需要添加新的判斷比較,進(jìn)行了修改,破壞了原類。不符合該原則,改進(jìn)辦法,使用抽象類或者接口進(jìn)行拓展。
三、里氏代換原則(LiskovSubstitutionPrinciple,LSP)
定義:所有引用基類對(duì)象的地方能夠透明地使用其子類的對(duì)象
理解:簡(jiǎn)單地說,就是接口(基類、抽象類)進(jìn)行定義,子類進(jìn)行動(dòng)態(tài)實(shí)現(xiàn)。便于(2)的原則實(shí)現(xiàn)。
例子:以下如service包中進(jìn)行接口定義,然后…impl實(shí)現(xiàn),再在controller中進(jìn)行基類接口聲明定義,最后在實(shí)際使用中進(jìn)行動(dòng)態(tài)調(diào)用。


四、依賴倒換原則(DependenceInversionPrinciple,DIP)
定義:抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象
理解:也就是面向接口編程,應(yīng)該先進(jìn)行接口定義該業(yè)務(wù)需要哪些方法,也可以適當(dāng)書寫步驟,然后再在實(shí)現(xiàn)類里面進(jìn)行細(xì)節(jié)完善。
例子:如下,就是先把接口寫好(明確業(yè)務(wù)),然后實(shí)現(xiàn)類進(jìn)行具體實(shí)現(xiàn)。

五、接口隔離原則(InterfaceSegregationPrinciple,ISP)
定義:使用多個(gè)專門的接口,而不使用單一的總接口
理解:和單一原則大同小異,就是針對(duì)的對(duì)象不同,一個(gè)是類一個(gè)是接口。在此方面深有感觸,剛開始時(shí)進(jìn)行編寫接口基本上按一個(gè)功能模塊(比如說登錄一模塊,支付一模塊,新聞一模塊)一個(gè)接口,后面維護(hù)時(shí)發(fā)現(xiàn)找相應(yīng)具體功能點(diǎn)就比較麻煩了,而且實(shí)現(xiàn)類里面十分龐雜(幾百行代碼看重都頭疼)。
六、合成復(fù)用原則(CompositeReusePrinciple,CRP)
定義:盡量使用對(duì)象組合,而不是繼承來達(dá)到復(fù)用的目的
理解:復(fù)用時(shí)應(yīng)該多用關(guān)聯(lián),少用繼承。不過感覺一般習(xí)慣性就關(guān)聯(lián)復(fù)合吧,沒什么好講的。
七、迪米特法則(LawofDemeter,LoD)
定義:一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用。
理解:為了避免修改該類后影響其他類(不過IDEA報(bào)錯(cuò)工具很強(qiáng)大也不要怕哈哈哈。),應(yīng)該讓此類盡可能不與其他類發(fā)生關(guān)聯(lián),主要有其他類構(gòu)造注入,參數(shù)注入,依賴注入等。在設(shè)計(jì)時(shí),多考慮有沒有必要加入引用,是否可以設(shè)計(jì)一個(gè)中間類去管理。
到此這篇關(guān)于淺談Java設(shè)計(jì)模式之七大設(shè)計(jì)原則的文章就介紹到這了,更多相關(guān)Java七大設(shè)計(jì)原則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?AI借助全局參數(shù)實(shí)現(xiàn)智能數(shù)據(jù)庫(kù)操作與個(gè)性化待辦管理
這篇文章主要介紹了Spring?AI借助全局參數(shù)實(shí)現(xiàn)智能數(shù)據(jù)庫(kù)操作與個(gè)性化待辦管理,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11
淺談兩個(gè)jar包中包含完全相同的包名和類名的加載問題
下面小編就為大家?guī)硪黄獪\談兩個(gè)jar包中包含完全相同的包名和類名的加載問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
解決SpringBoot項(xiàng)目啟動(dòng)后網(wǎng)頁(yè)顯示Please sign in的問題
這篇文章主要介紹了解決SpringBoot項(xiàng)目啟動(dòng)后網(wǎng)頁(yè)顯示Please sign in的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
java 使用ElasticSearch完成百萬(wàn)級(jí)數(shù)據(jù)查詢附近的人功能
本篇文章主要介紹了java 使用ElasticSearch完成百萬(wàn)級(jí)數(shù)據(jù)查詢附近的人功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
使用FeignClient調(diào)用POST表單Body內(nèi)沒有參數(shù)問題
這篇文章主要介紹了使用FeignClient調(diào)用POST表單Body內(nèi)沒有參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
使用dubbo+zookeeper+spring boot構(gòu)建服務(wù)的方法詳解
這篇文章主要給大家介紹了關(guān)于如何使用dubbo+zookeeper+spring boot構(gòu)建服務(wù)的相關(guān)資料,文中通過示例代碼及圖片介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
java后臺(tái)發(fā)起get請(qǐng)求獲取響應(yīng)數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了java后臺(tái)發(fā)起get請(qǐng)求獲取響應(yīng)數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
JAVA Spring Boot 自動(dòng)配置實(shí)現(xiàn)原理詳解
這篇文章主要介紹了詳解SpringBoot自動(dòng)配置原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-09-09

