主要內容:
本講主要講解面向對象設計的八大原則,和其中五個設計模式。
1. 綜述
目標:可復用(編譯單位級別的復用,不是源代碼的拷貝粘貼)
方法:面向對象
解決復雜問題方法:分解和抽象。
面向對象:適應變化、各負其責。
2. 面向對象設計八大原則
還是畫圖理解起來更容易些。。。

面向對象設計八大原則
【接口標準化】分析問題,有時候應該跳出軟件,結合人類發(fā)展歷史。。。秦始皇統(tǒng)一六國。
雕版印刷(緊耦合) --> 活字印刷(松耦合)
3. GOF-23模式
3.1 template method
- 應用程序開發(fā)人員使用lib時,由于lib的開發(fā)人員已經(jīng)寫好程序的主流程和部分步驟的具體實現(xiàn)(這些是相對穩(wěn)定的), 應用開發(fā)人員只需對lib的類進行繼承,并重寫部分(override)它的成員函數(shù)(推薦為protdected類型,不被外界直接調用)即可。(晚綁定)。
- 前提是有穩(wěn)定和不穩(wěn)定的成分,設計模式才有用武之地。如果全部都穩(wěn)定,或是全部都不穩(wěn)定,那么就不能使用設計模式。
- 設計模式看類圖時,要找到其中穩(wěn)定和變化的部分。
- library說:“你(應用程序)不要調用我(library),讓我調用你!”
- 虛函數(shù)和函數(shù)指針都是晚綁定。
3.2 strategy
- 【要動態(tài)的看問題,而不只是靜態(tài)的看待問題。加上時間軸,考慮到未來的變化】
- 使用多態(tài)的變量(類內和類外),要用指針。
- 為解決同一個問題的不同算法設計一個類,并實現(xiàn)各種的計算方法,當有新的算法時,則擴展算法(定義新的類來實現(xiàn))。不同算法之間可以相互替換(變化)。
- 如果if...else if...是絕對穩(wěn)定的,那么大部分可以采用strategy method。
- 優(yōu)點:當存在一些無用的算法時, 代碼具有良好的本地性,加載的代碼,就是調用相應的哪個實現(xiàn)方法,但利用if..else if...他們也會加載這些無用的算法到代碼段,影響性能。
3.3 observer/event觀察者模式
- 編譯時依賴。違背依賴倒置原則。
- c++支持多繼承,最好一個是主基類,其他的都是接口類。
- 對象間一對多的依賴關系,一個對象的狀態(tài)變化時,所有依賴于它的對象得到通知,并各自自動更新。
- 目標和觀察者獨立更改,松耦合。
- 目標自動發(fā)送通知,無需指定觀察者。
- 觀察者自己決定是否訂閱通知,不訂閱通知就不用將這個觀察者放入到目標雖維護的對象集合。目標無需知道觀察者是否訂閱了通知。
- 單一職責原則表現(xiàn)突出的模式
3.4 decorator
- 組合-->繼承;編譯時-->運行時的多態(tài);使用時,編譯時裝飾-->運行時裝飾。
- CryptoStream繼承于Stream,并擁有一個Stream的指針(使用這種方法99%都是decorator模式)。繼承是為了繼承接口,完善接口規(guī)范,指針是為了實現(xiàn)運行時多態(tài),實現(xiàn)具體的類。
- 當多個類繼承于同一個類時,多個類的相同的成員應該提到基類中,如果其中有些子類并不使用某些基類數(shù)據(jù)成員,這時就可以將這些數(shù)據(jù)成員放入一個中間類(DecoratorStream)中.
-
主體操作和擴展操作應該分開繼承。
前
后
3.5 bridge
- 類的數(shù)目1+n+n*m-->1+n+m
- 當多個類繼承同一個類,基類中有一些不被子類重寫的成員函數(shù)時,可將基類拆分成兩個類。(Messager和MessageImp)
抽象部分(平臺實現(xiàn))和實現(xiàn)部分(業(yè)務實現(xiàn)),多個變化維度分離,使他們可以獨立變化。

