boolan c 學習筆記之設計模式一

2021-07-30 03:17:43 字數 3142 閱讀 3717

什麼是設計模式

「每乙個模式描述了乙個在我們周圍不斷重**生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重複勞動」。

——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出來的...