第一次系統學習設計模式的時候,我還在學校裡。買的書是《設計模式–可復用物件導向軟體的基礎》翻譯過來的,機械工業出版社,2023年12月第1版。當時的感覺就是醍醐灌頂,這些老外太牛了。
自己在**中使用的模式真不多,在各種庫中看到不少,具有設計模式思想的東西不少。
最近有時間,把這本書又過了一遍,新的體會:文章組織和翻譯不太好啊(有的字句不太好理解啊,每個模式的應用例項我基本不知道啊,也許是原文就這樣(沒看過英文原版));學習模式要掌握其精髓,類的組織也不完全是死的,要靈活掌握,也可以靈活變化;新的感覺是它們也不是萬能的,也有侷限和不足。
每乙個設計模式,描述了乙個不斷重**生的問題,及其解決方案的核心。這樣,針對這類問題,就可以重用這個解決方案。
物件是對現實世界的抽象,可以是物,可以是乙個操作,可以是一種關係,也可以是乙個狀態,等等;抽象的粒度可以很大,也可以很小。
物件的型別只與它的介面有關。介面指類或物件能響應的請求的集合。物件與外界唯一的互動方式就是它的介面;讀取和改變物件的狀態的唯一方式也是呼叫他的介面。
相同介面的物件可以有不同的實現(介面和實現分離),所以才會有動態繫結(呼叫介面的請求編譯時就確定的,但它的實現(或者叫包含實現的物件)是執行時確定的,所以叫動態繫結),進而才有多型(動態繫結不同的物件,從而呼叫他們不同的實現)。
繼承分為實現繼承和介面繼承,c++中公有繼承純抽象類或者公有繼承父類中的純虛函式,就叫介面繼承;實現繼承包括了繼承父類的protected方法等。c++中通常同時用到實現繼承和介面繼承。
**復用機制:繼承(預設實現,實現繼承),物件組合,引數化型別即模板。
我理解設計模式的最大乙個思想是封裝變化,需要考慮現實問題中哪些是可變的,設計中應該支援哪些變化。下面從每個模式封裝變化和實際應用例項這兩個方面總結一下:
建立型模式:與物件的建立有關,隱藏了被用來建立的具體的類的資訊,隱藏了如何建立的資訊。這些建立類模式就能靈活地支援什麼被建立,誰建立,怎樣建立,何時建立等。
abstract factory(抽象工廠):
可變部分:建立不同的產品系列(每個系列包括多個不同的產品)
builder(生成器):
可變部分:用不同的方式方法建立組合物件?
factory method(工廠方法):
可變部分:建立不同的子類物件?
prototype(原型):
可變部分:建立不同的類物件
singleton(單體):
可變部分:不允許給乙個類建立多個例項,只建立乙個例項
結構型模式:類或物件的組合
adapter(介面卡):
可變部分:物件介面,把不同的物件介面適配成乙個需要的介面
bridge(橋接):
可變部分:物件的實現,支援物件的實現發生變化
composite(組成?):
可變部分:物件的結構和組成??支援物件的組成發生變化
decorator(修飾):
可變部分:物件的職責,支援物件職責發生變化
facade(外觀):
可變部分:乙個子系統的介面,與adapter區別??
flyweight(享元):
可變部分:物件的儲存開銷??
proxy(**):
可變部分:如何訪問乙個物件,物件的位置
行為型模式:類或物件之間的互動
chain of responsibility(職責鏈):
可變部分:響應乙個請求的物件
command(命令):
可變部分:何時、怎樣滿足乙個請求
interpreter(直譯器):
可變部分:乙個語言的文法及解釋
iterator(迭代器):
可變部分:遍歷訪問乙個容器中元素的方法
mediator(中介者):
可變部分:物件間怎樣互動、和誰互動
memento(備忘錄):
可變部分:乙個物件中哪些私有資訊存放在物件之外,以及什麼時候進行儲存
observer(觀察者):
可變部分:多個物件依賴於另外乙個物件,它們如何通訊保持一致狀態
state(狀態):
可變部分:物件的狀態,(及狀態對應的行為)
strategy(策略):
可變部分:演算法,跟bridge的區別
template method(模板方法):
可變部分:演算法中的某些步驟
visitor(訪問者):
可變部分:作用於乙個(組)物件的可讀操作
未完待續 設計模式學習總結
一 設計模式的分類 1.1 根據目的分類 1 建立型 關注物件的建立過程,描述如何將物件的建立和使用分離,讓呼叫者無需關心物件的建立細節,降低耦合的同時也更易於修改和擴充套件 2 結構型 用於處理類或物件的組合,將現有類或物件組織在一起形成更加強大的結構,3 行為型 用於描述類或物件怎樣互動和怎樣分...
設計模式學習筆記
1.簡單工廠模式 2.策略模式 3.單一職責原則 就乙個類而言,應該僅有乙個引起它變化的原因 4.開放 封閉原則 就是對軟體實體 類,模組,函式等 應該可以擴充套件,但是不可以修改,無論模組是多麼的 封閉 都會存在一些無法對之的封閉的變化。既然不可能完全封閉,設計人員就必須對他設計的模組應該對哪種變...
設計模式學習筆記
1.單例模式 限制只產生乙個物件。if object null 2.簡單工廠模式 通過乙個工廠類根據條件來建立各種各樣的類。3.工廠方法模式 對工廠類進行改造分解,工廠類公升級為介面,一對一建立工廠類 針對要生產的類 實現工廠介面。問題來了 簡單工廠和工廠方法有什麼優劣?4.迭代器模式 iterat...