面向?qū)ο笤O(shè)計(jì)的原則
衡量一個(gè)設(shè)計(jì)模式成功與否的關(guān)鍵
1.依賴倒置原則(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)定)。
(依賴分為編譯時(shí)依賴和運(yùn)行時(shí)依賴,編譯時(shí)依賴即編譯A時(shí)B必須
已經(jīng)存在损晤,即A依賴于B) - 我們一般都是通過(guò)抽象類來(lái)隔離變化。
2.開(kāi)放封閉原則(OCP) - 對(duì)擴(kuò)展開(kāi)放红竭,對(duì)更改封閉尤勋。(即通過(guò)增加模塊來(lái)應(yīng)對(duì)新需求,而不是重新進(jìn)行更改)
- 類模塊應(yīng)該是可擴(kuò)展的茵宪,而不是可修改的最冰。
3.單一職責(zé)原則(SRP) - 一個(gè)類應(yīng)該僅有一個(gè)引起他變化的原因
- 變化的方向隱含的類的責(zé)任。(即類的功能不應(yīng)該太多稀火,太多意味著承擔(dān)太多的功能)
4.Liskov替換原則(LSP) - 子類必須能夠替換它們的基類(IS-A)
- 繼承表達(dá)類型抽象暖哨。
5.接口隔離原則(ISP) - 不應(yīng)該強(qiáng)迫客戶程序依賴它們不用的方法。(即提供盡可能少的public方法凰狞,在真正有必要的時(shí)候才暴露出去)
- 接口應(yīng)該小而完備篇裁。
6.優(yōu)先使用對(duì)象組合,而不是類繼承 - 類繼承通常為“白箱復(fù)用”赡若,對(duì)象組合通常為“黑箱復(fù)用”
- 繼承在某種程度上破壞了封裝达布,子類父類耦合度高。
- 對(duì)象組合只要求被組合的對(duì)象具有良好定義的接口逾冬,耦合度低黍聂。
7.封裝變化點(diǎn)
使用封裝來(lái)創(chuàng)建對(duì)象之間的分界層,讓設(shè)計(jì)者可以在分界的一側(cè)進(jìn)行修改身腻,而不會(huì)對(duì)另外一側(cè)產(chǎn)生不良的影響产还,從而實(shí)現(xiàn)層次間的松耦合。
8.針對(duì)接口編程霸株,而不是針對(duì)實(shí)現(xiàn)編程雕沉。 - 不將變量類型聲明為某個(gè)特定的具體類,而是聲明為某個(gè)接口去件。
- 客戶程序無(wú)須獲知對(duì)象的具體類型坡椒,只需要知道對(duì)象所具有的接口。
- 減少系統(tǒng)中各部分的依賴關(guān)系尤溜,從而實(shí)現(xiàn)“高內(nèi)聚倔叼、松耦合”的類型設(shè)計(jì)方案。
GoF的23中模式的分類
另一種分類方式:
- 現(xiàn)代軟件設(shè)計(jì)的特征是“需求的頻繁變化”宫莱。設(shè)計(jì)模式的要點(diǎn)是尋找變化點(diǎn)丈攒,然后在變化點(diǎn)處應(yīng)用設(shè)計(jì)模式
- 記住沒(méi)有一步到位的設(shè)計(jì)模式,軟件的設(shè)計(jì)模式重構(gòu)是最適合的設(shè)計(jì)模式
參考書目:
重構(gòu)的關(guān)鍵技法:
動(dòng)態(tài)->靜態(tài)
早綁定->晚綁定
繼承->組合
編譯時(shí)依賴->運(yùn)行時(shí)依賴
緊耦合->松耦合