前言:一個月、20 個模式、無數次重構
花費一個月時間,將 GoF 經典 23 個設計模式中的 20 個逐一以 C++ 實作,收穫遠超預期。過程中深刻體會到:「看懂」與「寫出來」有天壤之別。許多原理在閱讀時似懂非懂,動手實作時才發現邏輯斷層。這段旅程讓我從只敢說「知道原理」轉為承認「我仍是初學者」,唯有踏實寫碼、反覆琢磨,知識才能內化。
初學者常見的四大誤區
- 盲目啃《Design Patterns》(GoF)當教科書:GoF 是奠基之作,非教學書。它缺乏對「面向介面程式設計」、「組合優於繼承」等核心原則的淺顯闡述,導致初學者難以串聯各模式的共性與差異。
- 語言特性與設計原理脫節:早年學 C++ 虛擬函數、抽象類別只為通過考試,不知其解決什麼問題。直到學習設計模式時,才恍然大悟:多態是為了「面向介面」,封裝是為了「變化隔離」。
- 忽略 UML 類圖與時序圖:結構圖揭示靜態關係,時序圖展示動態協作。兩者結合閱讀,能一眼掌握模式精髓。現在我已能僅靠圖示推導實作細節。
- 實戰經驗不足:模式源自實務問題的反覆解決總結。未寫過上萬行專案碼、未親歷維護災難,便談不上真正理解權衡。所謂「十萬行代碼前不談架構」確有其理。
推薦閱讀路徑與書籍
- 必讀:《敏捷軟體開發:原則、模式與實務》—— 專章講解 SOLID 原則(李氏替換、開放封閉等),是連結語言特性與模式應用的關鍵橋樑。
- 入門首選(二擇一):《設計模式精解》或《深入淺出設計模式》。兩書皆以生動案例結合 OO 原則講解,前者性價比更高。
- 避坑指南: 別一開始就想「全懂」。接受「當下不懂、日後悟道」的過程,多讀優秀開源專案碼(如 STL、Boost、Qt),在實戰中遇見模式。
延伸思考:非 OO 語言有設計模式嗎?
模式本質是「解決特定情境下反覆問題的慣用手法」,並未限定語言。純 C 專案中同樣存在模組化、回呼、狀態機等對應模式的實踐。只是 OO 語言提供多態、繼承等機制,讓模式表達更自然、結構更清晰。這個問題值得在未來的 C 語言大型專案中持續驗證。
輕鬆一笑:《追 MM 與設計模式》
文末附贈網路經典趣文,以追求女生過程類比 23 個模式(如工廠模式點餐、單例模式老公、代理模式自動回訊……)。雖無程式碼,卻精準對應模式適用情境,極適合建立直覺印象。建議有基礎後閱讀,定會會心一笑。
「設計模式不是終點,而是與複雜度共舞的起點。願各位同好在重構的路上,愈走愈寬。」