設計模式——開篇

爆米花9958發表於2017-02-24
什麼是設計模式?
一說起設計模式,可能很多人都覺得很高大上的感覺,事實上,設計模式只是針對某一類問題的最佳解決方案而已,設計模式是由許多優秀的軟體系統中總結出來的可成功複用的設計方案。我們常說的23種設計模式來自《設計模式》一書,也就是我們常說的GOF。

模式分類
1.建立型模式
建立型模式涉及物件的例項化,這類模式的特點是,不讓使用者程式碼依賴於物件的建立或排列方式,避免使用者直接使用new運算子建立物件
GOF的23種模式有5個屬於建立型模式:
  • 工廠方法模式:定義一個用於建立物件的介面,讓子類決定例項化哪個類。工廠方法模式使一個類的例項化延遲到其子類。
  • 抽象工廠模式:提供一個建立一系列或相互依賴物件的介面,而無須指定它們具體的類。
  • 生成器模式:將一個複雜物件的構建與它的表示分離,使同樣的構建過程可以建立不同的表示。
  • 原型模式:用原型例項指定建立物件的種類,並且通過複製這些原型建立新的物件。
  • 單例模式:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
2.行為型模式
行為型模式涉及怎樣合理地設計物件之間的互動通訊,以及怎樣合理為物件分配職責,讓設計富有彈性,易維護,易複用。
GOF的23種模式有11個屬於行為型模式:
  • 責任鏈模式:使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。
  • 命令模式:將一個請求封裝為一個物件,從而使使用者可用不同的請求對客戶進行引數化,對請求排隊或記錄請求日誌,以及支援可撤消的操作。
  • 直譯器模式:給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。
  • 迭代器模式:提供一種方法順序訪問一個聚合物件中的各個元素,而又不需要暴露該物件的內部表示。
  • 中介者模式:用一箇中介物件來封裝一系列的物件互動,中介者使各物件不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變改變他們之間的互動。
  • 備忘錄模式:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,這樣以後就可以將該物件恢復到原先儲存的狀態。
  • 觀察者模式:定義物件間的一種一對多的依賴關係,當一個物件的狀態發生變化時,所有依賴它的物件都得到通知並被自動更新。
  • 狀態模式:允許一個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。
  • 策略模式:定義一系列演算法,把他們獨立封裝起來,並且這些演算法之間可以相互替換。策略模式主要是管理一堆有共性的演算法,策略模式讓演算法獨立於使用它的客戶而變化,客戶端可以根據需要,很快切換這些演算法,並且保持可擴充套件性。
  • 模板方法模式:定義一個操作中演算法的骨架,而將一些步驟延遲到子類中。模板方法使子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
  • 訪問者模式: 表示一個作用於某物件結構中的各個元素的操作。它使你可以在不改變各個元素的類的前提下定義作用於這些元素的新操作。
3.結構型模式
結構型模式涉及如何組合類和物件以形成更大的結構,和類有關的結構型模式涉及如何合理地使用繼承機制;和物件有關的結構型模式涉及如何合理地使用物件組合機制。
GOF的23種模式有7個屬於結構型模式:
  • 介面卡模式:將一個類的介面轉換成客戶希望的另一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
  • 組合模式:將物件組合成樹形結構以表示“部分-整體”的層次結構。Composite使使用者對單個物件和組合物件的使用具有一致性。
  • 代理模式:為其他物件提供一種代理以控制對這個物件的訪問。
  • 享元模式:運用共享技術有效地支援大量細粒度的物件。
  • 外觀模式:為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
  • 橋接模式:將抽象部分與它的實現部分分離,使他們都可以獨立變化。
  • 裝飾者模式: 動態地給物件新增一些額外的職責。就功能來說裝飾模式相比生成子類更為靈活。
總結
一般來說,常用的設計模式有以下八種:單例、工廠、觀察者、代理、命令、介面卡、組合、訪問者。我們在使用過程中講究的是活學活用,而不是生搬硬套,設計模式是讓我們更好程式設計的工具,而不是我們的枷鎖,這才是學習設計模式的真正目的。

參考:

相關文章