一唆樊、軟件的設(shè)計目標(biāo)
? ? ? ? ? ? ? ?復(fù)用
二霜运、面向?qū)ο笤O(shè)計原則
1 依賴導(dǎo)致原則(DIP):?
高層模塊不依賴于底層模塊脾歇, 二者都應(yīng)該依賴于抽象
抽象(穩(wěn)定)不依賴于實現(xiàn)細節(jié)(變化), 實現(xiàn)細節(jié)應(yīng)該依賴于抽象
2. 開放封閉原則(OCP)
對擴展開放觉渴, 對更改封閉
類模塊應(yīng)該可擴展介劫, 但是不可修改
3. 單一職責(zé)原則(SRP)
一個類應(yīng)該僅有一個引起它變化的原因
變化的方向隱含著累的責(zé)任。
4. Liskov替換原則(LSP)
子類必須能夠替換它們的基類(IS-A)
繼承表達類型抽象
5. 接口隔離原則 (ISP)
不應(yīng)該強迫客戶程序依賴它們不用的方法
接口應(yīng)該小而完備
6. 優(yōu)先使用對象組合案淋,而不是繼承
類繼承”白箱復(fù)用“座韵, 對象組合”黑箱復(fù)用“
繼承在某種程度上破化了封裝,子類父類耦合度高
對象組合則要求被組合的對象具有良好定義的接口, 耦合度低
7. 封裝變化點
使用封裝來創(chuàng)建對象之間的分界層誉碴, 讓設(shè)計者可以在分界層的一側(cè)進行修改宦棺, 而不會對另外一側(cè)產(chǎn)生不良的影響, 從而實現(xiàn)層次見的松耦合黔帕。?
8. 針對接口編程代咸,而不是針對實現(xiàn)編程
不將變量類型聲明為某特定的具體類,而是某個接口
客戶端無需知道對象具體類型成黄, 只需知道對象具有的接口
減少系統(tǒng)各個部分的依賴關(guān)系呐芥, 從而實現(xiàn)”高內(nèi)聚, 松耦合“的類型設(shè)計方案
三奋岁、設(shè)計模式分類
1. 目的: 創(chuàng)建型思瘟, 結(jié)構(gòu)型, 行為型
2. 范圍: 靜態(tài)闻伶,動態(tài)
3. 封裝變化:? 組件協(xié)作滨攻, 單一職責(zé), 對象性能
接口隔離蓝翰, 數(shù)據(jù)結(jié)構(gòu)光绕,行為變化,對象創(chuàng)建畜份,狀態(tài)變化诞帐, 領(lǐng)域問題
四、重構(gòu)
關(guān)鍵技法:
1.靜態(tài)-》動態(tài)
2. 早綁定-》晚綁定
3. 繼承-》組合
4. 編譯時依賴-》運行時依賴
5. 緊耦合-》松耦合
五爆雹、組件協(xié)作
1. Template Method
? ? ?1)使用虛函數(shù)多態(tài)為程序框架提供了擴展點景埃,是代碼復(fù)用方面的基本實現(xiàn)結(jié)構(gòu)
? ? ? 2) 不要調(diào)用我,讓我來調(diào)用你的反向控制結(jié)構(gòu)是 Template Method的典型應(yīng)用(運行時調(diào)用)
? ? 3)C++ 通過protected?
2. Strategy
? ? ?1) 子類提供了一系列可以重用的的算法 顶别, 從而可以使得類型在運行的時候方便的根據(jù)需要在各算法間切換
? ? ?2) 提供條件判斷語句外的另外一種選擇, 含有條件判斷語句代碼通常都需要strategy模式
? ? 3) Strategy 對象沒有實例拒啰, 那么各個上下文可以共享一個Strategy驯绎,從而可以節(jié)省對象空間。
3. Observer
? 1)獨立改變目標(biāo)和觀察者谋旦, 從而使得兩者依賴關(guān)系松耦合剩失。
? 2) 目標(biāo)發(fā)送通知, 無需指定觀察者册着,通知可以自動傳播拴孤。
?3)觀察者自己決定是否需要訂閱通知, 目標(biāo)對象對此一無所知甲捏。?
4) 基于時間的UI框架種常用的設(shè)計模式演熟, MVC模式。
六、單一職責(zé)
1.? Decorator
1) 采用組合非繼承的手法芒粹, 實現(xiàn)了動態(tài)擴展對象功能的能力兄纺;
2)使用 is a component 繼承關(guān)系, 繼承component 類所具有的接口化漆, 實現(xiàn)上表現(xiàn)為 has - a component的組合關(guān)系估脆。
3)主體類在多方向上的擴展功能。?
2.? ?Bridge
1) 使用對象間組合關(guān)系解耦了抽象和實現(xiàn)之間的固有綁定關(guān)系座云, 實現(xiàn)抽象和實現(xiàn)沿著各自維度變化疙赠, 即子類化。
2)類似多繼承
3) 一般在兩個/多個非常強的變化維度朦拖。?