天天看點

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

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

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

繼續閱讀