程式設計師應該知道的二十三種設計模式

2022-08-30 06:33:10 字數 3938 閱讀 9198

1、工廠模式:factory

客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何建立及如何向客戶端提供。

2、建造模式:builder

將產品的內部表象和產品的生成過程分割開來,從而使乙個建造過程生成具有不同的內部表象的產品物件。建造模式使得產品內部表象可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。

3、工廠方法模式:factorymethod

核心工廠類不再負責所有產品的建立,而是將具體建立的工作交給子類去做,成為乙個抽象工廠角色,僅負責給出具體工廠類必須實現的介面,而不接觸哪乙個產品類應當被例項化這種細節。

4、原始模型模式:prototype

通過給出乙個原型物件來指明所要建立的物件的型別,然後用複製這個原型物件的方法建立出更多同型別的物件。原始模型模式允許動態的增加或減少產品類,產品類不需要非得有任何事先確定的等級結構,原始模型模式適用於任何的等級結構。缺點是每乙個類都必須配備乙個轉殖方法。

5、單例模式:singleton

單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項單例模式。單例模式只應在有真正的「單一例項」的需求時才可使用。

6、介面卡(變壓器)模式:adapter

把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據引數返還乙個合適的例項給客戶端.

7、橋梁模式:bridge

將抽象化與實現化脫耦,使得二者可以獨立的變化,也就是說將他們之間的強關聯變成弱關聯,也就是指在乙個軟體系統的抽象化和實現化之間使用組合/聚合關係而不是繼承關係,從而使兩者可以獨立的變化。

8、合成模式:composite

合成模式將物件組織到樹結構中,可以用來描述整體與部分的關係。合成模式就是乙個處理物件的樹結構的模式。合成模式把部分與整體的關係用樹結構表示出來。合成模式使得客戶端把乙個個單獨的成分物件和由他們復合而成的合成物件同等看待。

9、裝飾模式:decorator

裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承關係的乙個替代方案,提供比繼承更多的靈活性。動態給乙個物件增加功能,這些功能可以再動態的撤消。增加由一些基本功能的排列組合而產生的非常大量的功能。

10、門面模式:facade

外部與乙個子系統的通訊必須通過乙個統一的門面物件進行。門面模式提供乙個高層次的介面,使得子系統更易於使用。每乙個子系統只有乙個門面類,而且此門面類只有乙個例項,也就是說它是乙個單例模式。但整個系統可以有多個門面類。

11、享元模式:flyweight

flyweight在拳擊比賽中指最輕量級。享元模式以共享的方式高效的支援大量的細粒度物件。享元模式能做到共享的關鍵是區分內蘊狀態和外蘊狀態。內蘊狀態儲存在享元內部,不會隨環境的改變而有所不同。外蘊狀態是隨環境的改變而改變的。外蘊狀態不能影響內蘊狀態,它們是相互獨立的。將可以共享的狀態和不可以共享的狀態從常規類中區分開來,將不可以共享的狀態從類裡剔除出去。客戶端不可以直接建立被共享的物件,而應當使用乙個工廠物件負責建立被共享的物件。享元模式大幅度的降低記憶體中物件的數量。

12、**模式:proxy

**模式給某乙個物件提供乙個**物件,並由**物件控制對源物件的引用。**就是乙個人或乙個機構代表另乙個人或者乙個機構採取行動。某些情況下,客戶不想或者不能夠直接引用乙個物件,**物件可以在客戶和目標物件直接起到中介的作用。客戶端分辨不出**主題物件與真實主題物件。**模式可以並不知道真正的被**物件,而僅僅持有乙個被**物件的介面,這時候**物件不能夠建立被**物件,被**物件必須有系統的其他角色代為建立並傳入。

13、責任鏈模式:chain

在責任鏈模式中,很多物件由每乙個物件對其下家的引用而接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某乙個物件決定處理此請求。客戶並不知道鏈上的哪乙個物件最終處理這個請求,系統可以在不影響客戶端的情況下動態的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任推給下家。乙個請求可以最終不被任何接收端物件所接受。

14、命令模式:command

命令模式把乙個請求或者操作封裝到乙個物件中。命令模式把發出命令的責任和執行命令的責任分割開,委派給不同的物件。命令模式允許請求的一方和傳送的一方獨立開來,使得請求的一方不必知道接收請求的一方的介面,更不必知道請求是怎麼被接收,以及操作是否執行,何時被執行以及是怎麼被執行的。系統支援命令的撤消。

15、直譯器模式:interpreter

給定乙個語言後,直譯器模式可以定義出其文法的一種表示,並同時提供乙個直譯器。客戶端可以使用這個直譯器來解釋這個語言中的句子。直譯器模式將描述怎樣在有了乙個簡單的文法後,使用模式設計解釋這些語句。在直譯器模式裡面提到的語言是指任何直譯器物件能夠解釋的任何組合。在直譯器模式中需要定義乙個代表文法的命令類的等級結構,也就是一系列的組合規則。每乙個命令物件都有乙個解釋方法,代表對命令物件的解釋。命令物件的等級結構中的物件的任何排列組合都是乙個語言。

16、迭代子模式:iterator

迭代子模式可以順序訪問乙個聚集中的元素而不必暴露聚集的內部表象。多個物件聚在一起形成的總體稱之為聚集,聚集物件是能夠包容一組物件的容器物件。迭代子模式將迭代邏輯封裝到乙個獨立的子物件中,從而與聚集本身隔開。迭代子模式簡化了聚集的介面。每乙個聚集物件都可以有乙個或乙個以上的迭代子物件,每乙個迭代子的迭代狀態可以是彼此獨立的。迭代演算法可以獨立於聚集角色變化。

17、調停者模式:mediator

調停者模式包裝了一系列物件相互作用的方式,使得這些物件不必相互明顯作用。從而使他們可以鬆散偶合。當某些物件之間的作用發生改變時,不會立即影響其他的一些物件之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將物件的行為和協作抽象化,把物件在小尺度的行為上與其他物件的相互作用分開處理。

18、備忘錄模式:memento

備忘錄物件是乙個用來儲存另外乙個物件內部狀態的快照的物件。備忘錄模式的用意是在不破壞封裝的條件下,將乙個物件的狀態捉住,並外部化,儲存起來,從而可以在將來合適的時候把這個物件還原到儲存起來的狀態。

19、觀察者模式:observer

觀察者模式定義了一種一隊多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,使他們能夠自動更新自己。

20、狀態模式:state

狀態模式允許乙個物件在其內部狀態改變的時候改變行為。這個物件看上去象是改變了它的類一樣。狀態模式把所研究的物件的行為包裝在不同的狀態物件裡,每乙個狀態物件都屬於乙個抽象狀態類的乙個子類。狀態模式的意圖是讓乙個物件在其內部狀態改變的時候,其行為也隨之改變。狀態模式需要對每乙個系統可能取得的狀態創立乙個狀態類的子類。當系統的狀態變化時,系統便改變所選的子類。

21、策略模式:strategy

策略模式針對一組演算法,將每乙個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。策略模式把行為和環境分開。環境類負責維持和查詢行為類,各種演算法在具體的策略類中提供。由於演算法和環境獨立開來,演算法的增減,修改都不會影響到環境和客戶端。

22、模板方法模式:template

模板方法模式準備乙個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。先制定乙個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。

23、訪問者模式:visitor

訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構可以保持不變。訪問者模式適用於資料結構相對未定的系統,它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,就是增加乙個新的訪問者類。訪問者模式將有關的行為集中到乙個訪問者物件中,而不是分散到乙個個的節點類中。當使用訪問者模式時,要將盡可能多的物件瀏覽邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。

二十三種設計模式的C 實現

設計模式 design pattern 代表了最佳的實踐,通常被有經驗的物件導向的軟體開發人員所採用。設計模式是軟體開發人員在軟體開發過程中面臨的一般問題的解決方案。這些解決方案是眾多軟體開發人員經過相當長的一段時間的試驗和錯誤總結出來的。設計模式是一套被反覆使用的 多數人知曉的 經過分類編目的 設...

瘋狂的程式設計師 第二十三章

絕影覺得有公司和周總在後台撐腰,自己做這個題目是十拿九穩。不要說眼前這個王老師,就是放在整個學校,能懂dicom的又有多少人?就算懂,他們只搞研究不搞應用,理論和實際嚴重脫鉤。所以他很鄭重地跟王老師說 王老師,你放心,我做這個題目肯定沒問題,我們公司就是搞這個的,什麼技術資料 例子都有的是。王老師說...

程式設計師應該知道的事情

今天中午在 cxuan 的群內討論tdd和lambda的問題 炸出來一位前輩,為我們分享了很多知識 真正的大佬 借用 cxuan 的話來說,就是能夠使自己思想受到淘洗,資訊量大能讓你產生冥思 涵蓋了技術 職業規劃 業務 管理 特在這裡總結一下,希望大家看完也能有所收穫 不要過度追求新技術 新框架,每...