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