跟我一起學習設計模式(一)總覽

Dessign Pattern Overview

Overview

在軟體工程中,設計模式(design pattern)是對軟體設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。這個術語是由埃里希·伽瑪(Erich Gamma)等人在1990年代從建築設計領域引入到電腦科學的。

設計模式並不直接用來完成程式碼的編寫,而是描述在各種不同情況下,要怎麼解決問題的一種方案。面向對象設計模式通常以類別或對象來描述其中的關係和相互作用,但不涉及用來完成應用程式的特定類別或對象。設計模式能使不穩定依賴於相對穩定、具體依賴於相對抽象,避免會引起麻煩的緊耦合,以增強軟體設計面對並適應變化的能力。

引用自維基百科

Core Concepts

  • 變化是復用的天敵,本質是找到變化,封裝變化,提高可復用性
  • 如果一個系統所有點都在變化或者一直不變,是不能用設計模式來解決的

Design Principle

  • 依賴倒置原則(DIP)
    • 高層模組(穩定)不應該依賴於低層模組(變化),二者都應當依賴於抽象(穩定)
    • 抽象(穩定)不應該依賴於實現細節(變化),實現細節應該依賴於抽象
  • 開放封閉原則(OCP)
    • 對擴展開放,對更改封閉
    • 類模組應該是可擴展的,但是不可修改
  • 單一職責原則(SRP)
    • 一個類應該僅有一個引起它變化的原因
    • 變化的方向隱含著類的責任
  • Liskov替換原則(LSP)
    • 子類必須能夠替換它們的基類(IS-A)
    • 繼承表達類型抽象
  • 介面隔離原則(ISP)
    • 不應該強迫客戶程式依賴它們不用的方法
    • 介面應該小而完備
  • 優先使用對象組合,而不是類繼承
    • 類繼承通常為 白箱復用,對象組合通常為 黑箱復用
    • 繼承在某種程度上破壞了封裝性,子類弗雷耦合程度高
    • 而對象組合則只要求被組合的對象具有良好定義的介面,耦合度低
  • 封裝變化點
    • 使用封裝來創建對象之間的分界層,讓設計者可以在分界層的一側進行修改,而不會對另一側產生不良的影響,從而實現層次間的松耦合
  • 針對介面編程,而不是針對實現編程
    • 不將變數類型聲明為某個特定的具體類,而是聲明為某個介面
    • 客戶程式無需或獲知對象的具體類型,只需要知道對象所具有的介面
    • 減少系統中各部分的依賴關係,從而實現 「高內聚,低耦合」 的類型設計方案

Refactoring to Patterns

  • 靜態 ==》動態

  • 早綁定 ==》晚綁定

  • 繼承 ==》 組合

  • 編譯時依賴 ==》 運行時依賴

  • 緊耦合 ==》

GOF-23

  • 從目的來看
    • 創建型模式:將對象的部分創建工作延遲到子類或其他對象,從而應對需求變化為對象創建時具體類型實現引來的衝擊
    • 結構型模式:通過類繼承或者對象組合獲得更靈活的結構,從而應對需求變化為對象的結構帶來的衝擊
    • 行為型模式:通過類繼承或者對象的組合來劃分嘞與對象間的職責,從而應對需求變化 為多個交互的對象帶來的衝擊

Encapsulate Change

組件協作

  • Template Method
  • Observer/Event
  • Strategy

單一職責

  • Decorator
  • Bridge

對象創建

  • Factory Method
  • Abstract Factory
  • Prototype
  • Builder

對象性能

  • Singleton
  • Flyweight

介面隔離

  • Facade
  • Proxy
  • Mediator
  • Adapter

狀態變化

  • Memento
  • State

數據結構

  • Composite
  • Iterator
  • Chain if Resposibility

行為變化

  • Command
    • Vistor

領域問題

  • Interpreter

接下來會對每個模式進行詳解,特點是搞清楚來龍去脈,不用死記硬背,做到瞭然於胸