許多開發者對「設計模式」敬而遠之,覺得術語晦澀、結構抽象。其實,若用生活化的場景類比,這 23 個經典模式瞬間就能「通靈」。本文以「追女生」為主軸,帶你一次看懂創建型、結構型、行為型三大類模式的核心精神與適用時機。
帶妹子去麥當勞或肯德基吃雞翅,你只對服務員說「來四個雞翅」,不用管背後是哪家工廠炸的、油溫多少。核心:客戶端與具體產品解耦,由工廠類統一負責建立實例。缺點是新增產品時需修改工廠類,違反開放封閉原則。
不同籍貫的妹子聽得懂的方言不同,你備妥一台「多國語言翻譯機」,按下對應鍵就能用她的母語說「我愛你」。核心:將複雜物件的建構過程與其表示分離,使同一建構過程可產生不同表示。適合構件多、組裝步驟固定的物件。
請妹子吃漢堡,口味各異,你不記她們偏好,直接帶她到櫃檯說「要一個漢堡」,具體吃什麼讓她跟服務員說。核心:定義建立物件的介面,由子類決定實例化哪個類別。父類不再負責具體產品建立,彈性大增。
和妹子聊天需要大量肉麻情話,你事先蒐集 100 句存入「情話素材庫」,用時直接 clone() 貼上。核心:以原型實例指定建立物件的種類,透過複製原型建立新物件。避免繼承層級過深,動態增減產品類極為方便。
(做夢夢到)有六位嬌妻,她們喊「老公」指的都是同一個人——我。核心:確保某類別在全域僅有一個實例,並提供全域存取點。僅在真正需要「單一實例」時使用,避免濫用造成耦合。
聚會認識港妹 Sarah,她講廣東話你聽不懂,請會雙語的朋友 Kent 當翻譯。核心:將一個類別的介面轉換成客戶端期望的另一介面,讓原本不相容的類別能合作無間。
早安/晚安、讚美衣服/髮型,組合隨心所欲,別問我「早安+新髮型」怎麼說,自己 Bridge 組合一下。核心:將抽象化與實現化分離,使兩者可獨立變化。以組合/聚合取代繼承,降低耦合度。
妹子生日要送禮物,她挑了 T恤、裙子、包包三件,說「正好配成一套」,店員無奈打包。核心:將物件組合成樹狀結構以表現「整體-部分」層次,讓客戶端對單一物件與組合物件具有一致處理方式。
送照片當禮物,背面寫情話、外加相框、再裝設計盒。每一層都在「裝飾」核心禮物。核心:動態地給物件新增職責,比繼承更有彈性。可隨時撤銷裝飾,支援功能的排列組合爆炸。
你愛手動調光圈快門,妹子不懂。相機切到「自動檔」,她只需對準按快門。核心:為子系統提供一個統一的高層介面,降低客戶端使用複雜度。每個子系統通常僅有一個外觀類,且常為單例。
天天發簡訊手指酸,手機存常用語,發時只加上妹子名字。共用句子是「享元」,名字是外部狀態。核心:以共享方式支援大量細粒度物件。區分內部狀態(不變)與外部狀態(隨環境變化),大幅減少記憶體物件數量。
網聊開頭總是「嗨、哪裡人、多大、身高」,寫個 Proxy 程式自動回覆,只有有趣話題再通知你。核心:為目標物件提供代理,控制對真實物件的存取。客戶端無法分辨代理與真實主題,代理可延遲建立真實物件。
英語課寫紙條「願不願意做我女友?不願往前傳」,傳到第一排老師手裡……悲劇收場。核心:請求沿著處理者鏈傳遞,直到有物件處理它。發送者不需知曉具體處理者,可動態重組鏈路。
妹子管嚴靠弟弟傳紙條溝通,紙條就是 Command。弟弟同時給三個男友送命令,還嫌你請吃雜醬面小氣。核心:將請求封裝為物件,分離發送者與接收者。支援撤銷、佇列、日誌等進階功能。
約會步驟:吃西餐、看電影……全寫在書裡,跟著腳本執行即可。核心:定義語言文法並提供解釋器,解釋特定領域語言。適用於文法簡單、需頻繁解釋的場景。
求婚被索討:一克拉鑽石、湖邊別墅、法拉利……你一個個買,直到腦袋嗡嗡響。核心:提供統一介面順序存取聚合物件元素,不暴露內部結構。迭代邏輯封裝於獨立迭代器物件中。
四妹打麻將算不清帳,你在旁邊當中介者收支平帳,順便拿到四個電話。核心:以中介物件封裝同儕物件互動,將多對多依賴轉為一對多,降低耦合,互動邏輯集中管理。
跟多位妹子聊天怕記錯,備份每段對話到備忘錄,隨時可查歷史記錄。核心:在不破壞封裝下捕獲物件內部狀態並外部化儲存,支援後續恢復。適合撤銷/重做機制。
Tom 負責搜情報,發到郵件組,訂閱者自動收到最新動態。核心:定義一對多依賴,主題狀態變更時自動通知所有觀察者更新。實現發布-訂閱模式基石。
約看電影:不感興趣說「有事」;普通朋友說「可帶同事」;喜歡你說「幾點?散場再去泡吧」。表現好還能讓狀態升級。核心:物件內部狀態改變時行為隨之改變,彷彿換了類別。將狀態相關行為封裝於獨立狀態類別中。
有的請看電影、有的吃小吃、有的去海邊浪漫,目的同一(奪芳心),策略可互換。核心:定義演算法族群,封裝各演算法使其可互換。演算法變化不影響使用演算法的客戶端。
巧遇→破冰→追求→接吻→前戲→動手→愛撫→進去。流程固定,每步具體做法因人而異。核心:在抽象類別定義演算法骨架,將具體步驟延遲至子類別實現。符合好萊塢原則:「別調用我們,我們會調用你」。
每個妹子送花寫卡需針對特質,你搞不定,找花店老板挑花、禮品店老板挑卡,他們是 Visitor。核心:將作用於資料結構的操作封裝為訪問者,分離操作與資料結構。新增操作只需新增訪問者類別,不修改元素類別。
設計模式不是死記硬背的條文,而是解決特定問題的經驗結晶。下次面試或重構時,若能脫口而出「這像不像當時追妹子用的『策略模式』?」——你就真正內化了。
文章來源:https://www.ibeifeng.com/tech-69476.html