Java設(shè)計(jì)模式中的七大原則詳細(xì)講解
設(shè)計(jì)模式要進(jìn)行共性與可變性的分析,對(duì)共性進(jìn)行抽象,同時(shí)對(duì)可變性進(jìn)行封裝,沒(méi)有完美的設(shè)計(jì)模式,作為一名開(kāi)發(fā)者要懂得取舍,觸類旁通,開(kāi)發(fā)出高內(nèi)聚、低耦合、靈活性更高的軟件產(chǎn)品
1.開(kāi)閉原則(軟件設(shè)計(jì)第一原則)
定義:一個(gè)軟件實(shí)體應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉,即在不修改源代碼的基礎(chǔ)上擴(kuò)展軟件功能
本質(zhì)思想:
- 以抽象來(lái)固定不變的東西(把固定不變的抽出來(lái))
- 使用具體實(shí)現(xiàn)對(duì)可變性進(jìn)行封裝/隱藏
- 面向抽象編程
2.依賴倒置原則
開(kāi)閉原則是目標(biāo),依賴倒置是手段
三層含義:
- 高層模塊不應(yīng)該依賴于低層模塊,兩者都應(yīng)該依賴其抽象(例如一個(gè)類的成員變量、方法的入?yún)?、返回值不?yīng)該是一個(gè)具體類,而最好是一個(gè)抽象類)
- 抽象不應(yīng)該依賴細(xì)節(jié)(業(yè)務(wù)代碼不關(guān)心具體類)
- 細(xì)節(jié)應(yīng)該依賴抽象(業(yè)務(wù)代碼只關(guān)心抽象類)
依賴倒置原則的核心就是面向抽象(抽象類或者接口)編程
3.里氏替換原則
定義:在一個(gè)軟件產(chǎn)品中,父類對(duì)象可以出現(xiàn)的地方,都可以替換成它的子類對(duì)象,且不能發(fā)生錯(cuò)誤和異常,里氏替換原則為良好的繼承定義了規(guī)范
四層含義:
- 子類必須完全實(shí)現(xiàn)父類的抽象方法,但不能覆蓋(重寫(xiě))父類的非抽象方法
- 子類可以增加自己特有的方法
- 當(dāng)子類一定要重寫(xiě)父類的方法時(shí),子類方法的形參(前置條件)要比父類更寬松(例如父類使用HashMap,子類使用Map)
- 當(dāng)子類實(shí)現(xiàn)父類的抽象方法時(shí),方法的返回值(后置條件)要比父類更加嚴(yán)格
總結(jié):子類可以擴(kuò)展父類的功能,但是不能去改變父類原有的功能(遵循父類原有的基礎(chǔ)特性,進(jìn)行一系列的行為變化)
4.合成復(fù)用原則
定義:在軟件復(fù)用時(shí),要盡量使用組合/聚合(has a)等關(guān)聯(lián)關(guān)系來(lái)實(shí)現(xiàn),即組合/聚合優(yōu)先于繼承
如果要使用繼承關(guān)系,則必須嚴(yán)格遵循里氏替換原則
合成復(fù)用原則和里氏替換原則是相輔相成的,兩者都是開(kāi)閉原則的具體實(shí)現(xiàn)規(guī)范
設(shè)計(jì)模式用繼承對(duì)行為變化進(jìn)行分類,而不是使用繼承來(lái)復(fù)用邏輯
- 繼承破壞了類的封裝性,父類的實(shí)現(xiàn)細(xì)節(jié)全都暴露給子類了
- 父類和子類的耦合性太高,父類的修改直接影響子類
- 繼承是靜態(tài)的,與IOC動(dòng)態(tài)注入相違背
5.接口隔離原則
定義:使用多個(gè)專門(mén)的接口,而不是使用單一的總接口;客戶端調(diào)用者代碼不應(yīng)該依賴它不需要的接口
使用原則:
- 根據(jù)接口隔離原則拆分接口時(shí),首先必須滿足單一職責(zé)原則
- 提高高內(nèi)聚(每個(gè)接口都只負(fù)責(zé)相互獨(dú)立的部分,方法間都是強(qiáng)相關(guān)的)
- 定制服務(wù)
- 接口設(shè)計(jì)要有限度(不要讓類過(guò)于膨脹)
目標(biāo):在發(fā)生代碼變更,接口變更的情況下,盡量做到影響程度最低
6.迪米特法則
- 規(guī)則:一個(gè)類應(yīng)該盡量少的對(duì)其他類相互作用(依賴/調(diào)用)
- 解釋:只與直接朋友(私有成員變量、方法入?yún)?、new的對(duì)象)進(jìn)行通信,間接朋友:調(diào)用直接朋友的方法獲取到的對(duì)象
- 目的:讓類之間解耦,提高類的復(fù)用性,當(dāng)其他類發(fā)生變更的時(shí)候,對(duì)這個(gè)類的影響才最小
- 缺點(diǎn):過(guò)于嚴(yán)格的遵守此原則,會(huì)導(dǎo)致系統(tǒng)產(chǎn)生大量透明的小方法,需要在朋友數(shù)量和小方法之間進(jìn)行權(quán)衡
通過(guò)下面的例子加深理解,Person類想調(diào)用Stranger類執(zhí)行一些邏輯

public class Person {
private Friend friend = null;
// 遵循迪米特法則
// 將Stranger類封裝/隱藏了,Person類不知道Stranger類的存在
// 但是Friend類產(chǎn)生了callStrangerDoSomething這個(gè)透明的小方法
public void right(){
friend.callStrangerDoSomething();
}
// 不遵循迪米特法則
// 與Stranger類耦合了
public void wrong(){
Stranger stranger = friend.getStranger();
stranger.doSomething();
}
}
7.單一職責(zé)原則
- 單一職責(zé)原則要求一個(gè)接口或類只有一個(gè)原因引起變化(職責(zé)的范圍因人而異)
- 一個(gè)接口或一個(gè)類只負(fù)責(zé)一件明確的事,負(fù)責(zé)的事情越少越好
- 如果其他類依賴了一個(gè)包含多個(gè)職責(zé)的類,也會(huì)將不需要的職責(zé)包含進(jìn)來(lái),也違反了迪米特法則
到此這篇關(guān)于Java設(shè)計(jì)模式中的七大原則詳細(xì)講解的文章就介紹到這了,更多相關(guān)Java設(shè)計(jì)模式原則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA中已配置阿里鏡像但maven無(wú)法下載jar包的問(wèn)題及解決方法
這篇文章主要介紹了IDEA中已配置阿里鏡像但maven無(wú)法下載jar包的問(wèn)題,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
springboot引入druid解析sql的過(guò)程
在開(kāi)發(fā)中,有時(shí)我們可能會(huì)需要獲取SQL中的表名,那么因?yàn)椴煌臄?shù)據(jù)源類型SQL會(huì)存在部分差異,那么我們就可以使用alibaba 的druid包實(shí)現(xiàn)不同的數(shù)據(jù)源類型的sql解析,需要的朋友可以參考下2023-08-08
java+selenium實(shí)現(xiàn)滑塊驗(yàn)證
現(xiàn)在越來(lái)越多的網(wǎng)站都使用采用滑塊驗(yàn)證來(lái)作為驗(yàn)證機(jī)制,用于判斷用戶是否為人類而不是機(jī)器人,本文就將利用java和selenium實(shí)現(xiàn)滑塊驗(yàn)證,希望對(duì)大家有所幫助2023-12-12
Spring bean的實(shí)例化和IOC依賴注入詳解
這篇文章主要介紹了Spring bean的實(shí)例化和IOC依賴注入詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
Springcloud RestTemplate服務(wù)調(diào)用代碼實(shí)例
這篇文章主要介紹了Springcloud RestTemplate服務(wù)調(diào)用代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
SpringBoot項(xiàng)目整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)詳解(MYSQL轉(zhuǎn)換達(dá)夢(mèng)數(shù)據(jù)庫(kù))
這篇文章主要為大家詳細(xì)介紹了MYSQL轉(zhuǎn)換達(dá)夢(mèng)數(shù)據(jù)庫(kù)以及SpringBoot項(xiàng)目整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)的相關(guān)教程,文中的示例代碼講解詳細(xì),需要的可以參考下2025-03-03

