1. 程式人生 > 其它 >(多校)子集 (subset)

(多校)子集 (subset)

設計模式(Design Pattern)代表了最佳的實踐,在面向物件的程式設計中被很多老鳥們反覆使用。使用設計模式有很多好處:

  • 可重用程式碼
  • 保證程式碼可靠性
  • 使程式碼更容易被他人理解
  • ···

毫無疑問,設計模式具有極大的意義。

設計模式的型別

根據《設計模式》參考書,共有23種設計模式,這些模式分為三類:

型別 描述
建立型模式(Creational Patterns) 用於構建物件,以便它們可以從實現系統中分離出來。
結構型模式 (Structural Patterns) 用於在許多不同的物件之間形成大型物件結構。
行為型模式 (Behavioral Patterns) 用於管理物件之間的演算法、關係和職責

建立型模式

  • 單例模式 (Singleton Pattern):保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
  • 抽象工廠模式 (Abstract Pattern):提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類
  • 建造者模式 (Builder Pattern):將一個複雜物件的構建和表示分離,使得同樣的構建過程可以建立不同的表示。
  • 工廠方法模式 (Factory Method Pattern):定義一個用於建立物件的介面,讓子類決定將哪一個類例項化。Factory Method 使一個類的例項化延遲到其子類。
  • 原型模式 (Prototype Pattern):用原型例項指定建立物件的種類,並且通過拷貝這個原型來建立新的物件。

結構型模式

  • 介面卡模式(Adapter Pattern):將一個類的介面轉換成客戶希望的另外一個介面。Adapter 模式使得原本由於介面不相容而不能一起工作的類可以一起工作。
  • 橋接模式 (Bridge Pattern):將抽象部分和實現部分分離,使它們都可以獨立變化。
  • 裝飾者模式 (Decorator Pattern):動態地給一個物件新增一些額外的職責。就拓展功能而言,它比生成子類更靈活。
  • 組合模式 (Composite Pattern):將物件組合成樹形結構以表示”部分 - 整體“的層次結構。它使得客戶對單個物件和複合物件的使用具有一致性。
  • 外觀模式(Facade Pattern):為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
  • 享元模式(Flyweight Pattern):運用共享技術有效地支援大量細粒度的物件。
  • 代理模式 (Proxy Pattern):為其他物件提供一個代理以控制這個物件的訪問。

行為型模式

  • 模板方法模式(Template Method Pattern):定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template Method 使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
  • 命令模式(Command Pattern):將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可取消的操作。
  • 迭代器模式(Iterator Pattern):提供一種方法順序訪問一個聚合物件中各個元素,而又不需暴露該物件的內部表示。
  • 觀察者模式(Observer Pattern):定義物件間的一種一對多的依賴關係,以便當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並自動重新整理。
  • 中介者模式(Mediator Pattern):用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,並且可以獨立改變物件間地互動。
  • 備忘錄模式(Memento Pattern):在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到儲存的狀態。
  • 直譯器模式(Interpreter Pattern):給定一個語言,定義它的文法的一種表示,並定義一個直譯器,該直譯器使用該表示來解釋語言中的句子。
  • 狀態模式(State Pattern):允許一個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它所屬的類。
  • 策略模式(Strategy Pattern):定義一系列的演算法,把它們一個個封裝起來,並且使它們可相互替換。本模式使得演算法的變化可獨立於使用它的客戶端。
  • 責任鏈模式(Chain of Responsibility Pattern):為解除請求的傳送者和接收者之間的耦合,而使多個物件都有機會處理這個請求。將這些物件練成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件來處理它。
  • 訪問者模式(Visitor Pattern):表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。

怎麼學習設計模式

設計模式不是基於理論發明的,而是先有問題場景,再基於需要和情景不斷演化設計方案,最後把一些方案標準化為”模式“。

因此,通過實際案例學習是最好的!在討論每一個設計模式時,要儘量用生活中的真實問題來理解和分析。然後嘗試一步步的闡述設計,並以一個能匹配某些模式的設計收尾。

通過先分析問題,然後闡述解決方案,最後得到一個設計模式,這樣就不用死記那些圖形和定義了

如何選擇設計模式

設計模式是針對某種情景下某種問題的某種解決方式,也就是說,每個模式都有自己的使用場景、使用方法和使用後果。各模式也有相應的優缺點,要揚長避短。

總結:要真正領悟設計模式的精髓,需要有大量實踐經驗的積累。