設(shè)計(jì)模式是軟件工程中解決常見(jiàn)設(shè)計(jì)問(wèn)題的可復(fù)用方案,是每一位軟件設(shè)計(jì)師提升代碼質(zhì)量、可維護(hù)性與擴(kuò)展性的必備工具箱。經(jīng)典著作《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》歸納了23種核心模式,通常分為三大類:創(chuàng)建型、結(jié)構(gòu)型和行為型。
一、創(chuàng)建型模式(5種)
關(guān)注對(duì)象創(chuàng)建的靈活性與解耦。
- 單例模式:確保一個(gè)類只有一個(gè)實(shí)例,并提供全局訪問(wèn)點(diǎn)。常用于配置管理、線程池等。
- 工廠方法模式:定義一個(gè)創(chuàng)建對(duì)象的接口,但由子類決定實(shí)例化哪個(gè)類。將實(shí)例化延遲到子類。
- 抽象工廠模式:提供一個(gè)創(chuàng)建一系列相關(guān)或依賴對(duì)象的接口,而無(wú)需指定它們的具體類。用于產(chǎn)品族創(chuàng)建。
- 建造者模式:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與其表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。適用于構(gòu)造復(fù)雜、步驟多的對(duì)象。
- 原型模式:通過(guò)復(fù)制現(xiàn)有對(duì)象(原型)來(lái)創(chuàng)建新對(duì)象,而非通過(guò)新建類。適用于創(chuàng)建成本較高的對(duì)象。
二、結(jié)構(gòu)型模式(7種)
關(guān)注類和對(duì)象的組合,形成更大、更靈活的結(jié)構(gòu)。
- 適配器模式:將一個(gè)類的接口轉(zhuǎn)換成客戶期望的另一個(gè)接口。使原本接口不兼容的類可以一起工作。
- 橋接模式:將抽象部分與其實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。用于多維度變化。
- 組合模式:將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得客戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。
- 裝飾器模式:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。提供比繼承更靈活的擴(kuò)展功能方式。
- 外觀模式:為子系統(tǒng)中的一組接口提供一個(gè)一致的、簡(jiǎn)化了的界面(高層接口),降低子系統(tǒng)間的耦合。
- 享元模式:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度對(duì)象的復(fù)用。減少內(nèi)存消耗,常用于池技術(shù)。
- 代理模式:為其他對(duì)象提供一個(gè)代理或占位符以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。常見(jiàn)形式有遠(yuǎn)程代理、虛擬代理、保護(hù)代理等。
三、行為型模式(11種)
關(guān)注對(duì)象間職責(zé)分配與通信。
- 責(zé)任鏈模式:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合。將這些對(duì)象連成一條鏈,并沿著鏈傳遞請(qǐng)求。
- 命令模式:將請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,支持請(qǐng)求的排隊(duì)、記錄、撤銷等操作。
- 解釋器模式:給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,用來(lái)解釋語(yǔ)言中的句子。適用于特定領(lǐng)域語(yǔ)言。
- 迭代器模式:提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中的各個(gè)元素,而又不暴露其內(nèi)部表示。
- 中介者模式:用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互,使各對(duì)象不需要顯式地相互引用,從而使其耦合松散。
- 備忘錄模式:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài),以便以后可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。
- 觀察者模式:定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
- 狀態(tài)模式:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)似乎修改了它的類。
- 策略模式:定義一系列算法,將它們一個(gè)個(gè)封裝起來(lái),并使它們可以相互替換,使得算法可以獨(dú)立于使用它的客戶而變化。
- 模板方法模式:定義一個(gè)操作中的算法骨架,而將一些步驟延遲到子類中。使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
- 訪問(wèn)者模式:表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
與應(yīng)用指南
掌握這23種模式并非要求死記硬背,關(guān)鍵在于理解其背后的設(shè)計(jì)原則:如開(kāi)閉原則、依賴倒置、組合優(yōu)于繼承等。在實(shí)際軟件設(shè)計(jì)與制作中,應(yīng)避免為用模式而用模式,而應(yīng)識(shí)別出代碼中的“壞味道”(如緊耦合、難以擴(kuò)展),再選擇合適模式進(jìn)行重構(gòu)。初學(xué)者應(yīng)從最常用的模式(如工廠、單例、觀察者、策略、裝飾器)入手,在實(shí)踐中體會(huì)其精妙,逐步構(gòu)建起自己的設(shè)計(jì)模式知識(shí)體系,最終達(dá)到靈活、恰當(dāng)?shù)剡\(yùn)用模式,設(shè)計(jì)出優(yōu)雅、健壯的軟件架構(gòu)。