什麼是設計模式
「每乙個模式描述了乙個在我們周圍不斷重**生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重複勞動」。
——christopher alexander
軟體設計複雜的根本原因
變化客戶需求的變化
技術平台的變化
開發團隊的變化
市場環境的變化
如何解決複雜性?
分解抽象
軟體設計的目標復用
物件導向設計好處
抵禦變化
重新認識物件導向
理解隔離變化
• 從巨集觀層面來看,物件導向的構建方式更能適應軟體的變化,
能將變化所帶來的影響減為最小
各司其職
• 從微觀層面來看,物件導向的方式更強調各個類的「責任」
• 由於需求變化導致的新增型別不應該影響原來型別的實現——是
所謂各負其責
物件是什麼?
• 從語言實現層面來看,物件封裝了**和資料。
• 從規格層面講,物件是一系列可被使用的公共介面。
• 從概念層面講,物件是某種擁有責任的抽象。
物件導向八大設計原則
(一)依賴倒置原則(dip)
• 高層模組(穩定)不應該依賴於低層模組(變化),二者都應該依賴
於抽象(穩定) 。
• 抽象(穩定)不應該依賴於實現細節(變化) ,實現細節應該依賴於
抽象(穩定)
(二)開放封閉原則(ocp)
• 對擴充套件開放,對更改封閉。
• 類模組應該是可擴充套件的,但是不可修改。
(三)單一職責原則(srp)
• 乙個類應該僅有乙個引起它變化的原因。
• 變化的方向隱含著類的責任。
(四)liskov 替換原則(lsp)
• 子類必須能夠替換它們的基類(is-a)。
• 繼承表達型別抽象。
(五)介面隔離原則(isp)
• 不應該強迫客戶程式依賴它們不用的方法。
• 介面應該小而完備。
(六)優先使用物件組合,而不是類繼承
• 類繼承通常為「白箱復用」,物件組合通常為「黑箱復用」。
• 繼承在某種程度上破壞了封裝性,子類父類耦合度高。
• 而物件組合則只要求被組合的物件具有良好定義的介面,耦合
度低(七)封裝變化點
• 使用封裝來建立物件之間的分界層,讓設計者可以在分界層的
一側進行修改,而不會對另一側產生不良的影響,從而實現層
次間的松耦合。
(八)針對介面程式設計,而不是針對實現程式設計
• 不將變數型別宣告為某個特定的具體類,而是宣告為某個介面。
• 客戶程式無需獲知物件的具體型別,只需要知道物件所具有的
介面。• 減少系統中各部分的依賴關係,從而實現「高內聚、松耦合」
的型別設計方案。
將設計原則提公升為設計經驗
1. 設計習語 design idioms
• design idioms 描述與特定程式語言相關的低層模式,技巧,慣
用法。2. 設計模式 design patterns
• design patterns主要描述的是「類與相互通訊的物件之間的組織
關係,包括它們的角色、職責、協作方式等方面。
3. 架構模式 architectural patterns
• architectural patterns描述系統中與基本結構組織關係密切的高層
模式,包括子系統劃分,職責,以及如何組織它們之間關係的
規則。23種設計模式
從封裝變化角度對模式分類
元件協作:
• template method
• strategy
• observer / event
單一職責:
• decorator
• bridge
物件建立:
• factory method
• abstract factory
• prototype
• builder
物件效能:
• singleton
• flyweight
介面隔離:
• façade
• proxy
• mediator
• adapter
狀態變化:
• memento
• state
資料結構:
• composite
• iterator
• chain of
resposibility
行為變化:
• command
• visitor
領域問題:
• interpreter
重構關鍵技法
靜態-》 動態
早繫結-》 晚繫結
繼承-》 組合
編譯時依賴 -》 執行時依賴
緊耦合 -》 松耦合
設計模式的本質,分離變化點與穩定點,使程式編譯時穩定
template method 模式
strategy 策略模式
observer 觀察者模式
decorator 裝飾模式
bridge 橋模式
boolan c 學習筆記之move
前言 c 11提供了move語義,可以大大提高stl的效率。一 move對stl一些容器操作效率的提高 下面幾個圖中分別對vector,deque,multiset進行拷貝構造和move構造的效率對比測試,可以看到move構造比拷貝構造快很多。二 乙個擁有move特性的class mystring ...
boolan c 學習筆記1
1 標頭檔案防禦式定義 2 建構函式定義注意點,引數初始化預設值,初始化列表 3 函式引數盡量傳引用 返回值返回引用需要視情況而定,如區域性變數一般不返回引用 4 變數,函式內不改變成員變數,定義成const 5 友元函式,在類中把全域性函式宣告為友元,改全域性函式可以直接訪問類成員 友元函式在類中...
Boolan C 第二週學習筆記
第二週的課堂筆記,主要記錄一些以前自己不知道得東西。1.所謂的建構函式的三原則 其實預設情況下,編譯器缺省會提供拷貝構造,拷貝賦值,析構函式,它們所執行的就是預設的賦值與析構操作。並不是所有自定義的類都需要手動去寫這些函式,這次課程提供的乙個典型的情況就是類成員裡有指標時的情況,因為指標new出來的...