參考23個(gè)設(shè)計(jì)模式_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili
設(shè)計(jì)模式
什么是設(shè)計(jì)模式
“每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問題皂股,以及該問題的解決方案的核心墅茉。這樣,你就能一次又一次地使用該方案而不必做重復(fù)勞動(dòng)”呜呐。
——Christopher Alexander
如何解決復(fù)雜性就斤?
- 分解
- 人們面對(duì)復(fù)雜性有一個(gè)常見的做法:即分而治之,將大問題分解為多個(gè)小問題蘑辑,將復(fù)雜問題分解為多個(gè)簡(jiǎn)單問題洋机。
- 抽象
- 更高層次來講,人們處理復(fù)雜性有一個(gè)通用的技術(shù)洋魂,即抽象绷旗。由于不能掌握全部的復(fù)雜對(duì)象,我們選擇忽視它的非本質(zhì)細(xì)節(jié)副砍,而去處理泛化和理想化了的對(duì)象模型衔肢。
分類
一、GOF-23 模式分類
? 創(chuàng)建型(Creational)模式:將對(duì)象的部分創(chuàng)建工作延遲到子 類或者其他對(duì)象豁翎,從而應(yīng)對(duì)需求變化為對(duì)象創(chuàng)建時(shí)具體類型實(shí) 現(xiàn)引來的沖擊角骤。
? 結(jié)構(gòu)型(Structural)模式:通過類繼承或者對(duì)象組合獲得更靈 活的結(jié)構(gòu),從而應(yīng)對(duì)需求變化為對(duì)象的結(jié)構(gòu)帶來的沖擊心剥。
? 行為型(Behavioral)模式:通過類繼承或者對(duì)象組合來劃分 類與對(duì)象間的職責(zé)邦尊,從而應(yīng)對(duì)需求變化為多個(gè)交互的對(duì)象帶來 的沖擊。
二优烧、從封裝變化角度對(duì)模式分類
對(duì)象創(chuàng)建:
組件協(xié)作:
單一職責(zé):
對(duì)象性能:
接口隔離:
數(shù)據(jù)結(jié)構(gòu):
行為或狀態(tài)變化:
領(lǐng)域問題:
重構(gòu)關(guān)鍵方法
- 靜態(tài) -> 動(dòng)態(tài)
- 早綁定 -> 晚綁定
- 繼承 -> 組合
- 編譯時(shí)依賴 -> 運(yùn)行時(shí)依賴
- 緊耦合 -> 松耦合
總結(jié)
設(shè)計(jì)模式目標(biāo)
- 管理變化蝉揍,提高復(fù)用
設(shè)計(jì)模式兩種手段
- 分解
- 抽象
設(shè)計(jì)模式八大原則
- 依賴倒置原則(DIP)
- 高層模塊(穩(wěn)定)不應(yīng)該依賴于低層模塊(變化),二者都應(yīng)該依賴于抽象(穩(wěn)定) 畦娄。
- 抽象(穩(wěn)定)不應(yīng)該依賴于實(shí)現(xiàn)細(xì)節(jié)(變化) 又沾,實(shí)現(xiàn)細(xì)節(jié)應(yīng)該依賴于抽象(穩(wěn)定)弊仪。
- 開放封閉原則(OCP)
- 對(duì)擴(kuò)展開放,對(duì)更改封閉捍掺。
- 類模塊應(yīng)該是可擴(kuò)展的撼短,但是不可修改。
- 單一職責(zé)原則(SRP)
- 一個(gè)類應(yīng)該僅有一個(gè)引起它變化的原因挺勿。
- 變化的方向隱含著類的責(zé)任。
- Liskov 替換原則(LSP)
- 子類必須能夠替換它們的基類(IS-A)喂柒。
- 繼承表達(dá)類型抽象不瓶。
- 接口隔離原則(ISP)
- 不應(yīng)該強(qiáng)迫客戶程序依賴它們不用的方法。
- 接口應(yīng)該小而完備灾杰。
- 優(yōu)先使用對(duì)象組合蚊丐,而不是類繼承
- 類繼承通常為“白箱復(fù)用”,對(duì)象組合通常為“黑箱復(fù)用” 艳吠。
- 繼承在某種程度上破壞了封裝性麦备,子類父類耦合度高。
- 而對(duì)象組合則只要求被組合的對(duì)象具有良好定義的接口昭娩,耦合度低凛篙。
- 封裝變化點(diǎn)
- 使用封裝來創(chuàng)建對(duì)象之間的分界層,讓設(shè)計(jì)者可以在分界層的一側(cè)進(jìn)行修改栏渺,而不會(huì)對(duì)另一側(cè)產(chǎn)生不良的影響呛梆,從而實(shí)現(xiàn)層次間的松耦合。
- 針對(duì)接口編程磕诊,而不是針對(duì)實(shí)現(xiàn)編程
- 不將變量類型聲明為某個(gè)特定的具體類填物,而是聲明為某個(gè)接口。
- 客戶程序無需獲知對(duì)象的具體類型霎终,只需要知道對(duì)象所具有的接口滞磺。
- 減少系統(tǒng)中各部分的依賴關(guān)系,從而實(shí)現(xiàn)“高內(nèi)聚莱褒、松耦合”的類型設(shè)計(jì)方案击困。
重構(gòu)技巧
- 靜態(tài)->動(dòng)態(tài)
- 早綁定 -> 晚綁定
- 繼承 -> 組合
- 編譯時(shí)依賴 -> 運(yùn)行時(shí)依賴
- 緊耦合 -> 松耦合
設(shè)計(jì)原則作用
- 在穩(wěn)定和變化中尋找隔離點(diǎn),從而管理變化保礼。
設(shè)計(jì)原則注意點(diǎn)
- 如果代碼全都變化沛励,那么任何設(shè)計(jì)模式都無法適用。
- 如果代碼全部穩(wěn)定炮障,設(shè)計(jì)模式也沒有了意義目派。
- 變化是相對(duì)而言。因此尋找適用的設(shè)計(jì)模式之前胁赢,需要找到相對(duì)變化的部分企蹭。
- 設(shè)計(jì)模式的八大原則,比具體的設(shè)計(jì)模式更重要
將設(shè)計(jì)原則提升為設(shè)計(jì)經(jīng)驗(yàn)
- 設(shè)計(jì)習(xí)語 Design Idioms
? Design Idioms 描述與特定編程語言相關(guān)的低層模式,技巧谅摄,慣用法徒河。 - 設(shè)計(jì)模式 Design Patterns
? Design Patterns主要描述的是“類與相互通信的對(duì)象之間的組織關(guān)系,包括它們的角色送漠、職責(zé)顽照、協(xié)作方式等方面。 - 架構(gòu)模式 Architectural Patterns
? Architectural Patterns描述系統(tǒng)中與基本結(jié)構(gòu)組織關(guān)系密切的高層模式闽寡,包括子系統(tǒng)劃分代兵,職責(zé),以及如何組織它們之間關(guān)系的規(guī)則爷狈。
以下情況不建議使用設(shè)計(jì)模式
- 代碼可讀性很差
- 需求理解很淺
- 變化點(diǎn)沒用顯現(xiàn)
- 不是系統(tǒng)的關(guān)鍵依賴點(diǎn)
- 項(xiàng)目沒用復(fù)用價(jià)值
經(jīng)驗(yàn)
- 不要為模式而模式
- 關(guān)注抽象類和接口
- 理清變化點(diǎn)和穩(wěn)定點(diǎn)
- 審視依賴關(guān)系
- 擁有框架和應(yīng)用的分隔思維
- 良好的設(shè)計(jì)是演化的結(jié)果