設計模式不是死記硬背的類圖,而是**解決特定問題的經驗方案**。本文用「追 MM」系列故事,將 23 種模式核心意圖**一句話串起**,助你建立直觀心智模型,面試、架構設計信手拈來。
| 模式 | 核心意圖 | 追 MM 故事 | 關鍵詞 |
|---|---|---|---|
| 工廠方法 | 定義創建接口,子類決定實例化哪類 | 帶 MM 吃漢堡,**MM 自己跟服務員說要什麼口味**,我不操心細節 | 解耦、多態創建 |
| 抽象工廠 | 創建相關/依賴對象族,無需指定具體類 | 全套約會套餐:**麥當勞全家桶** 或 **肯德基全家桶**,風格統一不可混搭 | 產品族、一致性 |
| 建造者 | 分步構建複雜對象,分離構建與表示 | 多語言翻譯機:**按鍵組合**說出「我愛你」,同一過程產出不同語言 | 分步驟、靈活組合 |
| 原型 | 複製現有對象創建新對象,避免重複初始化 | 肉麻情話 **複製貼上**發給不同 MM,改個名字即可 | 克隆、性能優化 |
| 單例 | 全局唯一實例,受控訪問點 | **老公只有一個**,六個老婆喊「老公」指向同一人 | 全局唯一、懶漢/餓漢 |
| 模式 | 核心意圖 | 追 MM 故事 | 關鍵詞 |
|---|---|---|---|
| 適配器 | 將接口轉換為客戶期望的另一接口 | 不會說粵語,**Kent 充當翻譯**讓我和 Sarah 溝通 | 接口轉換、兼容舊代碼 |
| 橋接 | 抽象與實現分離,雙向獨立擴展 | 問候語(早/晚)× 讚美語(衣服/髮型) **自由組合**,不綁死 | 組合替代繼承、雙維度變化 |
| 組合 | 樹形結構表達「整體-部分」,統一對待 | 生日禮物:**T恤+裙子+包包 = 一套**,整體打包送出 | 樹形、遞歸、統一介面 |
| 裝飾器 | 動態給對象添加職責,替代繼承 | 照片 → **相框 → 禮盒 → 包裝紙**,層層包裝核心不變 | 動態增強、疊加、透明 |
| 外觀 | 為子系統提供統一高層入口 | 專業相機**自動檔**一鍵拍照,隱藏光圈/快門/ISO 細節 | 簡化接口、降低耦合 |
| 享元 | 共享細粒度對象,區分內部/外部狀態 | 常用語句**存手機短語**,發時加上 MM 名字,不重複輸入 | 共享池、內外狀態分離 |
| 代理 | 為對象提供代理,控制訪問 | 聊天機器人**自動回覆**「嗨/多大/身高」,其餘轉人工 | 訪問控制、延遲加載、AOP |
| 模式 | 核心意圖 | 追 MM 故事 | 關鍵詞 |
|---|---|---|---|
| 責任鏈 | 請求沿鏈路傳遞,直到被處理 | 表白紙條**一排傳遞**,誰願意誰處理,傳到老師手裡完蛋 | 解耦發送者接收者、動態鏈 |
| 命令 | 將請求封裝為對象,支援撤銷/排隊/日誌 | MM 寫**紙條指令**給弟弟送達,我執行,弟弟是命令對象 | 封裝請求、解耦調用者執行者 |
| 解釋器 | 定義語言文法並提供解釋器 | 《泡 MM 真經》**腳本化**,約會按步驟執行:巧遇→破冰→追求→接吻... | DSL、文法樹、解釋執行 |
| 迭代器 | 順序訪問聚合對象,不暴露內部結構 | MM 提出**清單條件**:鑽石→別墅→50cm... 我逐項滿足/拒絕 | 統一遍歷介面、多種遍歷方式 |
| 中介者 | 封裝對象交互,降低耦合 | 四個 MM 打麻將**我當莊家算錢**,輸贏只跟我結算 | 集中控制、N:M 變 1:N |
| 備忘錄 | 捕獲對象內部狀態,外部化存儲,支援撤銷 | 同時聊幾個 MM,**備忘錄記錄**跟誰說了什麼,防翻車 | 狀態快照、封裝性、撤銷 |
| 觀察者 | 定義一對多依賴,狀態變化自動通知 | 加入 **MM 情報郵件組**,Tom 發布情報,我們自動收到 | 發布-訂閱、鬆耦合、事件驅動 |
| 狀態 | 對象內部狀態改變行為,如換類 | 約電影:無興趣→「有事」;猶豫→「帶同事」;喜歡→「幾點?再去酒吧」 | 狀態類、上下文委派、消除 if-else |
| 策略 | 定義算法族,封裝互換 | 不同 MM **不同約會策略**:看電影/吃小吃/海邊散步,目的同手段異 | 算法族、運行時切換、開閉原則 |
| 模板方法 | 定義算法骨架,子類實現細節 | 《如何說服女生上床》**八大步驟固定**,每步具體話術因人而異 | 骨架固定、細節延遲、好萊塢原則 |
| 訪問者 | 分離數據結構與操作,新增操作不改結構 | 情人節送禮:**花店老板選花、禮品店老板選卡**,根據 MM 特質定製 | 雙分派、跨層級訪問、操作擴展易 |