設計模式大集合
設計模式大集合
設計模式的定義和結構
軟件設計模式是:在軟件設計中,一個通用的,可重用的解決方案,用於解決給定上下文中的一個常見問題。
設計模式的描述
下面定義了一個標準描述設計模式的結構。
- 模式名稱和分類
一個描述性和惟一的名稱,有助於識別和引用模式。 - 意圖
描述模式背後的目標和使用它的原因。 - 別名
模式的其他名稱。 - 動機
由問題和可使用該模式的上下文組成的場景。 - 適用性
這種模式可用的情況;模式的上下文。 - 結構
模式的圖形表示。類圖和交互圖可以用於此目的。 - 參與者
模式中使用的類和對象的列表及其在設計中的角色。 - 協作
描述模式中使用的類和對象如何相互作用。 - 結果
對使用該模式導致的結果、副作用和交易的描述。 - 實施
對模式實施的描述;這個模式的解決方案部分。 - 示例代碼
演示如何在編程語言中使用模式的說明。 - 已知用途
模式的實際使用示例。 - 相關模式
與模式有一定關系的其他模式;討論模式和相似模式之間的差異。
生成模式
名稱 | 描述 |
---|---|
抽象工廠 | 提供了一個接口,用於創建相關的一組對象,而無需指定具體的類。 |
構建器 | 將復雜對象的構造與它的表示分開,允許相同的構造過程創建各種各樣的表示。 |
依賴註入 | 一個類接受來自註入器的對象,而不是直接創建對象。 |
工廠方法 | 定義了創建單個對象的接口,但是讓子類決定實例化哪個類。工廠方法讓一個類延遲實例化到子類。 |
延遲創建 | 對象的延遲初始化策略,即在第一次需要時,延遲創建一個對象、計算一個值或其他一些昂貴的過程。 |
Multiton | 確保一個類只有命名的實例,並提供一個全局的訪問點。 Key-value 版本,集成多個類的單例模式。 |
對象池 | 通過回收不再使用的對象來避免昂貴的獲取和釋放資源。可以被認為是連接池和線程池模式的泛化。 |
Prototype | 通過一個原型實例指定要創建的對象種類,並從現有對象的“骨架”中創建新的對象,從而提高性能並將內存占用保持在最小值。 |
資源獲取是初始化 | (RAII)確保通過將資源與合適對象的生命周期相關聯來適當地釋放資源。 |
單例模式 | 確保一個類只有一個實例,並且提供了一個全局的訪問點。 |
結構模式
名稱 | 描述 |
---|---|
適配器、包裝器或轉換器 | 將一個類的接口轉換成客戶期望的另一個接口。一個適配器讓類協同工作,否則由於接口不兼容,就不能這樣做。 |
橋 | 將抽象與它的實現分離,使兩者獨立地變化。 |
組合 | 將對象組合成樹形結構,以表示部分整體的層次結構。使客戶端可以統一的處理單個物體和對象的組合。 |
裝飾器 | 將額外的責任附加到一個動態保持相同接口的對象上。裝飾器提供了一種靈活的替代方法來擴展功能。 |
擴展對象 | 將功能添加到層次結構中,而不需要改變層次結構。 |
Facade | 為子系統中的一組接口提供統一的接口。門面定義了一個更高級的接口,使子系統更易於使用。 |
Flyweight | 使用共享來有效地支持大量的類似對象。 |
前端控制器 | 模式與Web應用程序的設計有關。它提供了處理請求的集中入口點。 |
標記 | 空接口將元數據與一個類關聯起來。 |
模塊 | 組幾個相關的元素,例如類、單例、方法,以及全局使用的方法,都是一個概念實體。 |
代理 | 為另一個對象提供代理或占位符來控制對它的訪問。 |
雙胞胎 | 對在不支持該特性的編程語言中,允許對多重繼承進行建模。 |
行為模式
名稱 | 描述 |
---|---|
黑板 | 人工智能模式,用於組合不同的數據來源(參見黑板系統) |
責任鏈 | 避免將請求的發送者與它的接收者耦合,因為它給多個對象一個處理請求的機會。將接收對象串起來,並沿著鏈傳遞請求,直到一個對象處理它。 |
命令 | 將請求封裝為一個對象,從而允許具有不同請求的客戶端參數化,以及請求的排隊或日誌記錄。它還允許支持非可行的操作。 |
解釋器 | 使用一種語言,為它的語法定義一個表示,以及一個使用該表示來解釋語言句子的解釋器。 |
叠代器 | 提供了一種方法,可以在不暴露其底層表示的情況下連續訪問聚合對象的元素。 |
中介 | 定義了一個對象,它封裝了一組對象之間的交互方式。中介通過使對象不顯式地相互引用來促進松散耦合,並且允許它們的交互獨立地變化。 |
Memento | 不違反封裝、捕獲和具體化對象的內部狀態,允許對象稍後恢復到這個狀態。 |
Null對象 | 通過提供一個默認對象來避免空引用。 |
觀察者或發布/訂閱 | 定義了對象之間的一對多依賴關系,其中一個對象的狀態變化會導致被通知和自動更新的所有依賴項。 |
仆人 | 為一組類定義公共功能。 |
規範 | 以布爾式的方式重組業務邏輯。 |
狀態 | 允許物體在其內部狀態發生變化時改變其行為。這個對象將會出現改變它的類。 |
策略 | 定義了一個算法家族,封裝了每一個算法,並使它們可以互換。策略讓算法獨立於使用它的客戶端。 |
模板方法 | 在一個操作中定義一個算法的骨架,將一些步驟推遲到子類。Template method允許子類重新定義算法的某些步驟,而不改變算法的結構。 |
訪問者 | 表示要在對象結構的元素上執行的操作。訪問者可以在不改變其操作的元素的類的情況下定義新的操作。 |
並發模式
名稱 | 描述 |
---|---|
活動對象 | 將方法執行從位於其自身控制線程中的方法調用中分離出來。我們的目標是通過使用異步方法調用和處理請求的調度程序來引入並發性。 |
阻止 | 當對象處於特定狀態時,只對對象執行一個動作。 |
屬性綁定 | 結合多個觀察者來強制不同對象的屬性,以某種方式同步或協調。 |
區塊鏈 | 分散存儲數據,並就如何在Merkle樹中處理數據達成一致,可選地使用數字簽名進行任何個人貢獻。 |
計算內核 | 在並行計算中,相同計算操作(但數據不同)的計算,使用共享數組將不同計算的數據統一計算,如GPU優化矩陣乘法或卷積神經網絡。 |
雙重檢查鎖定 | 通過首先測試鎖定標準(“鎖定提示”)以不安全的方式來減少獲得鎖的開銷;只有當它成功時,實際的鎖定邏輯才會繼續。在某些語言/硬件組合中實現時,可能是不 |
基於事件的異步 | 處理在多線程程序中發生的異步模式的問題。 |
被保護的懸掛系統 | 管理操作,需要獲得一個鎖,並且在執行操作之前必須滿足一個先決條件。 |
Join | Join-pattern提供了一種通過消息傳遞來編寫並發、並行和分布式程序的方法。與線程和鎖的使用相比,這是一個高級編程模型。 |
鎖定 | 一個線程在資源上放置一個“鎖”,防止其他線程訪問或修改它。 |
消息傳遞設計模式(MDP) | 允許在組件和應用程序之間交換信息(即消息)。 |
監視對象 | 其方法受到互斥鎖的影響,從而防止多個對象在同一時間錯誤地使用它。 |
反應堆 | 一個反應堆對象為必須同步處理的資源提供了一個異步接口。 |
讀寫鎖 | 允許對一個對象進行並發讀訪問,但是需要對寫操作進行獨占訪問。 |
調度程序 | 顯式地控制線程何時執行單線程代碼。 |
線程池 | 是為了執行許多任務而創建的,這些任務通常是在隊列中組織的。通常情況下,線程的任務比線程多得多。可以被看作是對象池模式的特殊情況。 |
線程特定的存儲 | 靜態或“全局”內存局部到線程。 |
.NET Application Architecture
類別 | 設計模式 | 描述 |
---|---|---|
緩存 | 惰性獲取 | 延遲了資源的獲取,以優化設備資源的使用。 |
緩存 | 緩存依賴項 | 使用外部信息來確定存儲在緩存中的數據的狀態。 |
緩存 | 頁面緩存 | 提高了頻繁訪問的動態Web頁面的響應時間,但更改頻率較低,並消耗大量的系統資源來構建。 |
通信 | 活動對象 | 通過封裝服務請求和服務完成響應來支持異步處理。 |
通信 | 通信器 | 將通信的內部細節封裝在一個單獨的組件中,可以通過不同的通道進行通信。 |
通信 | 雙向 | 雙向消息通信,服務和客戶端都可以獨立地發送消息,而不考慮使用單向或請求-應答模式。 |
通信 | 發送並忘記 | 當沒有響應的時候,通信就會觸發,並忘記一個單向消息通信機制。 |
通信 | 網關 | 通過一個通用的抽象接口提供對外部系統的訪問,這樣使用者就不需要了解外部系統接口。 |
通信 | 攔截過濾器 | 過濾了一個可組合過濾器(獨立模塊),它在Web頁面請求期間實現常見的預處理和後處理任務。 |
通信 | 管道和過濾器 | 通過管道和過濾器路由消息,這些管道和過濾器可以在管道通過管道時修改或檢查消息。 |
通信 | 可靠的會話 | 結束了在源和目的地之間傳遞消息的可靠傳輸,而不考慮將端點分離的中介體的數量或類型。 |
通信 | 請求響應 | 一個雙向消息通信機制,客戶端期望收到對發送的每條消息的響應。 |
通信 | 服務代理 | 和代理實現了消費應用程序可以使用的組件,而不知道它沒有訪問實際的目標組件或服務。組件通過對遠程組件或服務的呼叫,並將結果返還給消費應用程序。代理抽象了與其他遠程組件通信的細節,通常是在使用ASMX或WCF服務時。 |
通信 | 服務定位器 | 集中分布式服務對象查找,提供一個集中的控制點,並充當一個緩存,消除冗余查找。 |
表示 | 反轉控制 | 填充了對象的任何依賴項,這些對象或組件必須在對象被應用程序使用之前完成。 |
表示 | 兩步視圖 | 將模型數據轉換為邏輯表示,而不需要任何特定的格式,然後轉換邏輯表示,以添加所需的實際格式。 |
表示 | 模型-視圖-控制器 | 將域內的數據、表示和基於用戶輸入的操作分離到三個單獨的類中。該模型管理應用程序域的行為和數據,響應關於其狀態(通常來自視圖)的信息的請求,並響應指令以改變狀態(通常來自控制器)。視圖管理信息的顯示。控制器從用戶那裏解釋鼠標和鍵盤輸入,通知模型和/或視圖在適當的時候進行更改。 |
表示 | 模型-視圖-演示者 | 將請求處理分為三個角色,視圖負責處理用戶輸入,負責應用程序數據和業務邏輯的模型,以及負責表示邏輯和協調視圖和模型之間交互的演示者。 |
表示 | 模型-視圖-viewmodel | 模型-視圖-控制器(MVC)的變種,它是為現代UI開發平臺量身定做的,視圖是設計師的職責,而不是傳統的開發人員。 |
表示 | 頁面控制器 | 接受來自請求的輸入,並在Web站點上處理特定的頁面或動作。 |
表示 | 分頁 | 將大量的內容分割成單獨的頁面,以優化系統資源,並最小化對屏幕空間的使用。 |
表示 | 異步回調 | 在後臺執行的單獨的線程上執行長時間運行的任務,並為線程在任務完成時調用回調函數提供一個函數。 |
同步 | 並行 | 處理允許多個批處理作業並行運行,以最小化總的處理時間。 |
同步 | 分區 | 分區多個大型批處理作業並發運行。 |
GRASP(General responsibility assignment software patterns) - 通用職責分配軟件模式
GRASP並不是設計模式,而更像是早期面向對象設計者提出的一些經驗。
控制器
使用一個非UI的類來處理UI的功能。也可以認為控制器模式是建議一個多層的架構。- 創建者
這是一個原則,用來確定誰應該負責創建一個類。
類B應該負責創建類A,如果滿足下面的條件之一: - B的實例包含A的實例
- B的實例存儲了A的實例
- B的實例密切使用A的實例
B的實例擁有創建實例A的初始信息
高內聚
是一個評估模式。是指一個類中,包含的功能之間有密切的相關性。- 低耦合
是一個評估模式。是指類和類之間, - 在類之間,依賴性低。
- 一個類的改變,對其它類影響小。
高重用性。
間接性(Indirection)
將兩個類之間的協調功能封裝到一個中介類中。比如MVC模式中Controller就是View和Model的中介類。信息專家
將職責放到最需要信息的類中。多態性(Polymorphism)
這是面向對象的基本功能。對變化的保護
open for extension, closed for modification.
支持擴展,允許增加屬性和方法。
隱藏變化,變化不會影響調用者以前的代碼。
現在,基本上使用interface/implementation,來實現這個原則。
定義一個接口類,供外部調用。
實現一個實現類,外部只能通過接口類來調用實現類的功能。純粹性(Pure fabrication)
使用Service將提供特定的功能。
SOLID
面向對象設計5原則:
單一職責原則
一個類應該只有一個單一的責任(例如,只對軟件規範的一部分進行更改應該能夠影響一個類的定義)。打開/關閉原則
open for extension, but closed for modification.
“軟件實體……應該是支持擴展,隱藏變更。”Liskov替換原則
“程序中的對象應該可以替換它們的子類型的實例,而不會改變程序的正確性。”接口隔離原則
“許多客戶端特定的接口比一個通用接口要好。”依賴性倒置原則
一個人應該“依賴於抽象,而不是具體的東西。”
參照
- Software design pattern
- GRASP (object-oriented design)
- SOLID (object-oriented design)
設計模式大集合