一、設(shè)計(jì)原則
(一)核心思想
所有設(shè)計(jì)原則圍繞高內(nèi)聚、低耦合展開,最終目標(biāo)是讓代碼易理解、易擴(kuò)展、易維護(hù)。高內(nèi)聚指模塊內(nèi)部元素關(guān)聯(lián)緊密,專注單一功能;低耦合指模塊間依賴度低,僅通過(guò)接口交互。
(二)七大原則
-
單一職責(zé)原則(SRP)
- 定義:一個(gè)類僅有一個(gè)引起它變化的原因,即只負(fù)責(zé)一項(xiàng)職責(zé)。
- 核心作用:降低類的復(fù)雜度,減少需求變更帶來(lái)的影響,便于代碼復(fù)用與組合。
- 記憶口訣:“一職一類”
- 應(yīng)用場(chǎng)景:如學(xué)生管理系統(tǒng)中,學(xué)生實(shí)體類僅負(fù)責(zé)存儲(chǔ)學(xué)生信息,學(xué)生業(yè)務(wù)類負(fù)責(zé)處理學(xué)生相關(guān)業(yè)務(wù)邏輯。
-
開閉原則(OCP)
- 定義:軟件實(shí)體對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。
- 核心作用:通過(guò)新增代碼實(shí)現(xiàn)功能擴(kuò)展,避免修改原有穩(wěn)定代碼,降低需求變動(dòng)風(fēng)險(xiǎn),減少維護(hù)成本。
- 記憶口訣:“擴(kuò)開改關(guān)”
- 應(yīng)用場(chǎng)景:電商系統(tǒng)新增促銷活動(dòng)時(shí),通過(guò)新增促銷策略類實(shí)現(xiàn),而非修改原有價(jià)格計(jì)算邏輯。
-
里氏替換原則(LSP)
- 定義:所有引用基類對(duì)象的地方,都能透明地使用其子類對(duì)象,子類可在任何場(chǎng)景替代父類且不改變程序邏輯。
- 核心作用:保障繼承體系的穩(wěn)定性,支持多態(tài)復(fù)用,是實(shí)現(xiàn)代碼靈活擴(kuò)展的基礎(chǔ)。
- 記憶口訣:“子類代父類,邏輯不改變”
- 應(yīng)用場(chǎng)景:在圖形繪制系統(tǒng)中,圓形、矩形等子類可替代圖形父類對(duì)象進(jìn)行繪制操作。
-
依賴倒置原則(DIP)
- 定義:上層模塊不依賴下層模塊,細(xì)節(jié)依賴抽象,兩者都應(yīng)依賴抽象。
- 核心作用:降低模塊間耦合,提升系統(tǒng)擴(kuò)展性,便于替換具體實(shí)現(xiàn)。
- 記憶口訣:“依賴抽象,而非具體”
- 應(yīng)用場(chǎng)景:業(yè)務(wù)層依賴數(shù)據(jù)訪問(wèn)層的抽象接口,而非具體的數(shù)據(jù)庫(kù)實(shí)現(xiàn)類,方便切換不同數(shù)據(jù)庫(kù)。
-
接口隔離原則(ISP)
- 定義:用多個(gè)小接口替代一個(gè)大接口,避免接口包含冗余方法。
- 核心作用:減少接口依賴,降低類的實(shí)現(xiàn)成本,提高代碼靈活性。
- 記憶口訣:“小接口,低依賴”
- 應(yīng)用場(chǎng)景:將包含多種功能的用戶接口拆分為登錄接口、注冊(cè)接口、信息查詢接口等。
-
迪米特法則(LOD)
- 定義:一個(gè)實(shí)體應(yīng)盡量少與其他實(shí)體發(fā)生相互作用,即最少知道原則。
- 核心作用:降低系統(tǒng)復(fù)雜度,減少模塊間交互成本,提高模塊獨(dú)立性。
- 記憶口訣:“少交互,低耦合”
- 應(yīng)用場(chǎng)景:訂單類只需調(diào)用庫(kù)存服務(wù)類的接口,無(wú)需了解庫(kù)存服務(wù)類內(nèi)部的具體實(shí)現(xiàn)細(xì)節(jié)。
-
合成復(fù)用原則(CRP)
- 定義:盡量使用合成/聚合的方式實(shí)現(xiàn)代碼復(fù)用,而非繼承。
- 核心作用:避免繼承帶來(lái)的高耦合問(wèn)題,提高代碼靈活性與可維護(hù)性。
- 記憶口訣:“合成聚合優(yōu),繼承慎用之”
- 應(yīng)用場(chǎng)景:汽車類通過(guò)聚合發(fā)動(dòng)機(jī)類、輪胎類等實(shí)現(xiàn)功能,而非繼承這些類。
二、設(shè)計(jì)模式
(一)核心定義
設(shè)計(jì)模式是一套被反復(fù)使用、經(jīng)過(guò)分類編目的代碼設(shè)計(jì)經(jīng)驗(yàn)總結(jié),本質(zhì)是設(shè)計(jì)原則的具體實(shí)踐,旨在實(shí)現(xiàn)代碼可重用、易理解、高可靠。
(二)三大分類及常見(jiàn)模式
1. 創(chuàng)建型模式(聚焦對(duì)象創(chuàng)建)
核心作用是分離對(duì)象的創(chuàng)建與使用,簡(jiǎn)化對(duì)象創(chuàng)建過(guò)程。
-
單例模式
- 定義:保證一個(gè)類僅有一個(gè)實(shí)例,并提供全局訪問(wèn)點(diǎn)。
- 核心作用:避免頻繁創(chuàng)建與銷毀對(duì)象,節(jié)省系統(tǒng)資源,確保全局狀態(tài)一致性。
- 記憶口訣:“單例唯一,全局訪問(wèn)”
- 應(yīng)用場(chǎng)景:全局配置類、數(shù)據(jù)庫(kù)連接池、日志對(duì)象等。
- 實(shí)現(xiàn)方式:餓漢式(線程安全、無(wú)懶加載,易浪費(fèi)內(nèi)存)、懶漢式(支持懶加載,多線程需雙重鎖定或靜態(tài)內(nèi)部類保證安全)。
-
工廠模式
- 定義:創(chuàng)建對(duì)象時(shí)不暴露創(chuàng)建邏輯,通過(guò)共同接口指向新創(chuàng)建對(duì)象,包括簡(jiǎn)單工廠、工廠方法、抽象工廠。
- 核心作用:解耦對(duì)象創(chuàng)建與使用,便于擴(kuò)展不同產(chǎn)品實(shí)例。
- 記憶口訣:“工廠創(chuàng)建,邏輯隱藏”
- 應(yīng)用場(chǎng)景:日志記錄器根據(jù)不同條件創(chuàng)建不同類型的日志對(duì)象;數(shù)據(jù)庫(kù)訪問(wèn)層根據(jù)配置創(chuàng)建不同數(shù)據(jù)庫(kù)連接對(duì)象。
-
建造者模式
- 定義:將復(fù)雜對(duì)象的構(gòu)建過(guò)程分解為多個(gè)簡(jiǎn)單步驟,逐步構(gòu)建復(fù)雜對(duì)象。
- 核心作用:分離對(duì)象構(gòu)建與表示,靈活構(gòu)建不同配置的復(fù)雜對(duì)象。
- 記憶口訣:“分步構(gòu)建,復(fù)雜對(duì)象”
- 應(yīng)用場(chǎng)景:創(chuàng)建包含多個(gè)部件的電腦對(duì)象,可按不同配置逐步組裝。
2. 結(jié)構(gòu)型模式(處理類/對(duì)象組合)
核心作用是優(yōu)化類與對(duì)象的組合方式,提高系統(tǒng)靈活性與可擴(kuò)展性。
-
適配器模式
- 定義:將一個(gè)類的接口轉(zhuǎn)換為客戶端期望的另一種接口,使不兼容的類能夠協(xié)作。
- 核心作用:解決接口不兼容問(wèn)題,復(fù)用現(xiàn)有類。
- 記憶口訣:“接口適配,兼容協(xié)作”
- 應(yīng)用場(chǎng)景:在新系統(tǒng)中復(fù)用舊系統(tǒng)的類,通過(guò)適配器轉(zhuǎn)換接口;不同格式的數(shù)據(jù)讀取,通過(guò)適配器統(tǒng)一讀取接口。
-
裝飾器模式
- 定義:動(dòng)態(tài)地給對(duì)象添加額外職責(zé),不改變對(duì)象原有結(jié)構(gòu)。
- 核心作用:靈活擴(kuò)展對(duì)象功能,避免繼承帶來(lái)的類爆炸問(wèn)題。
- 記憶口訣:“動(dòng)態(tài)裝飾,功能擴(kuò)展”
- 應(yīng)用場(chǎng)景:給咖啡添加牛奶、糖等配料,通過(guò)裝飾器動(dòng)態(tài)擴(kuò)展咖啡功能。
-
代理模式
- 定義:通過(guò)代理對(duì)象控制對(duì)真實(shí)對(duì)象的訪問(wèn)。
- 核心作用:實(shí)現(xiàn)訪問(wèn)控制、增強(qiáng)功能(如日志、事務(wù)、安全等)。
- 記憶口訣:“代理控制,增強(qiáng)訪問(wèn)”
- 應(yīng)用場(chǎng)景:Spring AOP通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)事務(wù)管理、日志記錄等橫切關(guān)注點(diǎn);遠(yuǎn)程代理實(shí)現(xiàn)遠(yuǎn)程對(duì)象訪問(wèn)。
3. 行為型模式(處理對(duì)象間協(xié)作)
核心作用是規(guī)范對(duì)象間的通信與協(xié)作方式,提高系統(tǒng)靈活性與可維護(hù)性。
-
策略模式
- 定義:定義一系列算法,將每個(gè)算法封裝起來(lái),使它們可相互替換。
- 核心作用:動(dòng)態(tài)切換算法,避免大量條件判斷。
- 記憶口訣:“算法封裝,動(dòng)態(tài)切換”
- 應(yīng)用場(chǎng)景:電商系統(tǒng)根據(jù)不同促銷活動(dòng)切換不同的價(jià)格計(jì)算策略。
-
觀察者模式
- 定義:定義對(duì)象間的一對(duì)多依賴關(guān)系,當(dāng)一個(gè)對(duì)象狀態(tài)改變時(shí),其依賴者都能收到通知并自動(dòng)更新。
- 核心作用:實(shí)現(xiàn)對(duì)象間的松耦合通信,便于擴(kuò)展觀察者。
- 記憶口訣:“一對(duì)多,狀態(tài)變,通知更”
- 應(yīng)用場(chǎng)景:消息訂閱系統(tǒng),訂閱者關(guān)注主題,主題狀態(tài)變化時(shí)通知所有訂閱者。
-
模板方法模式
- 定義:定義算法骨架,將步驟延遲到子類實(shí)現(xiàn)。
- 核心作用:復(fù)用通用算法邏輯,子類專注實(shí)現(xiàn)差異化步驟。
- 記憶口訣:“骨架定義,步驟延遲”
- 應(yīng)用場(chǎng)景:Spring的JdbcTemplate封裝數(shù)據(jù)庫(kù)操作通用流程,用戶只需實(shí)現(xiàn)具體的結(jié)果映射邏輯。
三、記憶技巧總結(jié)
(一)設(shè)計(jì)原則記憶
- 英文首字母記憶:?jiǎn)我宦氊?zé)(S)、開閉(O)、里氏替換(L)、接口隔離(I)、依賴倒置(D)、迪米特(L)、合成復(fù)用(C),可簡(jiǎn)化為“SOILDLC”輔助記憶。
- 口訣記憶:結(jié)合前文各原則的記憶口訣,串聯(lián)成順口溜,如“一職一類,擴(kuò)開改關(guān),子類代父類,依賴抽象,小接口低依賴,少交互低耦合,合成聚合優(yōu)”。
(二)設(shè)計(jì)模式記憶
- 分類記憶:按創(chuàng)建型、結(jié)構(gòu)型、行為型分類,分別記憶各類模式的核心特點(diǎn)與應(yīng)用場(chǎng)景。
-
口訣記憶:
- 創(chuàng)建型:“抽工建單元”(抽象工廠、工廠方法、建造者、單例、原型)
- 結(jié)構(gòu)型:“與時(shí)代相結(jié)合,裝外向”(適配器、代理、橋接、組合、裝飾、外觀、享元)
- 行為型:“責(zé)令中介觀疊被,防撞車”(責(zé)任鏈、命令、中介者、觀察者、迭代器、備忘錄、訪問(wèn)者、狀態(tài)、策略),再加上模板方法模式。