從重構到模式
— 筆記整理自 北京理工大學 計算機學院
什麼是模式
- 模式記錄了專家的經驗,並且讓非專家也能理解,其核心是對真實世界的抽象和組織
- 模式是發展的,是經過驗證的專家經驗的重用
- 模式的名稱構成了一份詞彙表,幫助開發者更好的交流,更快的理解一個系統,更容易的重組一個系統
- 模式的構成
- 語境
- 問題
- 解決方案
模式分類
- 代碼模式——特定編程語言相關
- 分析模式——透過需求表面瞭解本質問題
- 設計模式——局部強化
- 架構模式——軟件系統的基礎結構組織模型
- 建議學習順序
- 代碼模式(忽略)
- 設計模式(重點)
- 分析模式(瞭解)
- 架構模式(瞭解)
架構模式
- 架構模式描述軟件系統裏的基本的結構組織或綱要
- 架構模式提供一些事先定義好的子系統,指定它們的責任,並給出把它們組織在一起的原則和指南
- 部分架構模式和設計模式重疊
- 架構模式常常可以分解成很多個設計模式的聯合使用
設計模式
- 建築模式:《建築的永恆之道》(The Timeless Way of Building)
- 專家們使用遷移的思想得出軟件設計模式理論
- 設計模式是一種對一套相互作用的類的描述
- 設計模式是一種實踐的總結,是OOP最直接的表現
- 設計模式的根本意圖是適應需求變化
- 程序員應該掌握設計模式
Gof設計模式分類
- 結構型模式 將一組對象組合成更大的結構
- 行爲型模式 定義系統內對象間的通信,以及複雜程序中的流程控制
- 創建型模式 通過使用更復雜的創建對象的方法取代new,換取了對需求變更的從容應對
備註:圖片託管於github,請確保網絡的可訪問性
工廠模式
- 工廠模式專門負責將大量有共同接口的類實例化
- 工廠模式可以動態決定將哪一個類實例化,不必事先知道每次要實例化哪一個類
- 工廠模式的形式
- 簡單工廠模式(Simple Factory)
- 工廠方法模式(Factory Method)
- 抽象工廠模式(Abstract Factory)
- 簡單工廠模式根據提供給它的數據,返回幾個可能類中的一個類的實例
- 簡單工廠模式實際上不屬於GoF設計模式,但作爲入門比較容易理解
單件模式
- 單件模式做爲“全局變量”的替代品出現
- 具有全局變量的特點:全局可見、貫穿應用程序的整個生命期
- 也具有全局變量不具備的性質:同類型的對象實例只可能有一個
- 單件模式實現方法
- 隱藏(private)構造函數
- 類內維護一個靜態、私有的本類對象的引用
- 提供靜態公共函數,如GetInstance(),返回類型爲該類的唯一對象的引用
觀察者模式
- 定義對象間的一種一對多的依賴關係
- 當一個對象的狀態發生改變時, 所有依賴於它的對象都得到通知並被自動更新
- 應用場景:當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變
- 典型應用:MVC架構中,將表示層和數據邏輯層分開,邏輯層數據變化後需要通知多個表示層
觀察者模式結構
備註:圖片託管於github,請確保網絡的可訪問性
設計模式不是全部
- 濫用設計模式造成過度設計
- 程序結構的靈活性設計不是基於需求變更的要求
- 設計模式不應該是一開始就應該關注的
- 重構的主要目的不是爲了多用設計模式
- 程序結構的好壞與使用的設計模式的多少無關
- 體現設計意圖,適度設計
從需求到達設計模式
- 模式尤其是設計模式常常扮演着過度設計的角色
- 解決避免過度設計的方法:重構
- 從需求通過重構到達模式
- 重構的結果未必一定爲某種設計模式
- 設計模式是面向對象設計的基石
- TDD和重構是設計演進的基石
推薦書籍
《REfactoring To Patterns》
模式小結
- 不同的模式位於不同的層次
- 架構模式——大尺度,系統級,全局
- 設計模式——中等尺度,子系統,局部
- 分析模式——策略,業務模型
- 代碼模式——小尺度,特定語言,編程技巧
- 下級層次不會影響到上一級層次