學習李建忠老師視訊.
設計模式簡介
每一個模式描述了一個在我們周圍不斷重複 發生的問題,以及該問題的解決方案的核 心。
christopher alexander
設計模式描述了軟體設計過程中某一類常見 問題的一般性的解決方案。
面向對象設計模式描述了面向對象設計過程中、特定場景下、類與互相通信的對象之間常見的組織關系。
人是一個經驗性的動物。
設計模式與面向對象
* 面向對象設計模式解決的是“類與互相通信的對象之間的組織關系,包括它們的角色、職責、協作方式幾個方面。
* 面向對象設計模式是“好的面向對象設計”,所謂“好的面向對象設計”是那些可以滿足“應對變化,提高複用”的設計。
* 面向對象設計模式描述的是軟體設計,是以它是獨立于程式設計語言的, 但是面向對象設計模式的最終實作仍然要使用面向對象程式設計語言來表達,本課程基于c#語言,但實際上它适用于支援.net架構的所有.net語言,如visual basic.net 、c++/cli等。
* 面向對象設計模式不像算法技巧,可以照搬照用,它是建立在對“ 向對象”純熟、深入的了解的基礎上的經驗性認識。掌握面向對象設計模式的前提是首先掌握“面向對象”!
重新認識面向對象
* 對于前面的例子,從宏觀層 來看,面向對象的建構方式更能适應軟體的變化,能将變化所帶來的影響減為最小
* 對象是什麼?
– 從概念層面講,對象是某種擁有責任的抽象。
– 從規格層面講,對象是一系列可以被其他對象使用的公共接口。
– 從語言實 層 來看,對象封裝了代碼和資料。
從設計原則到設計模式
* 對接口程式設計,而不是 對實 程式設計
– 客戶無需知道所使用對象的特定類型,隻需要知道對象擁有客戶所期望的接口。
* 優先使用對象組合,而不是類繼承
– 類繼承通常為“白箱複用”,對象組合通常為“黑箱複用”。繼承在某種程度上破壞了封裝性,子類父類耦合度高;而對象組合則隻要求被組合的對 象具有良好定義的接口,耦合度低。
* 封裝變化點
– 使用封裝來建立對象之間的分界層,讓設計者可以在分界層的一側進行修改,而不會對另一側産生不良的影響,進而實 層次間的松耦合。
* 使用重構得到模式
– 設計模式的應用不宜先入為主,一上來就使用 設計模式是對設計模式的最大誤用。沒有一步到位的設計模式。靈活 軟體開發實踐提倡的“refactoringto patterns ”是目前普遍公認的最好的使用設計模式的方法。
幾條更具體的設計原則
* 單一職責原則 (srp):
– 一個類應該僅有一個引起它變化的原因。
* 開放封閉原則 (ocp):
– 類子產品應該是可擴充的,但是不可修改(對擴充開放,對更改封閉)
* liskov 替換原則 (lsp):
– 子類必須能夠替換它們的基類
* 倒置原則 (dip):
– 高層子產品不應該依 于低層子產品,二者都應該依 于抽象。
– 抽象不應該依 于實 細節,實 細節應該依 于抽象。
* 接口隔離原則 (isp):
– 不應該強迫客戶程式依 于它們不用的方法。
講座總結
* 設計模式描述了軟體設計過程中某一類常見問題的一般性的解決方案。面向對象設計模式描述了面向對象設計過程中、特定場景下、類與互相通信的對象之間常見的組織關系。
* 深刻了解面向對象是學好設計模式的基礎,掌握一定的面向對象設計原則才能把握面向對象設計模式的精髓,進而實 靈活運用設計模式。
* 三大基本面向對象設計原則
– 對接口程式設計,而不是 對實 程式設計
– 優先使用對象組合,而不是類繼承
– 封裝變化點
* 使用重構得到模式。靈活軟體開發實踐提倡的“refactoringto patterns”是目前普遍公認的最好的使用設計模式的方法。