最近,我在看Head First設計模式。這本書寫的非常棒,讀的過程中總有“原來代碼還可以這樣設計”的感覺,對我有醍醐灌頂的功效,極力推薦大家閱讀看看。不過在讀完全書之后發現好多模式的概念和使用場景都忘了,或者已經記得不清晰了,為了方便日后的學習與記憶,在此進行了一番整理。
設計模式的六大原則:
1、單一職責原則(Single Responsibility Principle)
就一個類而言,應該僅有一個引起它變化的原因。簡單地說就是一個類只做一件事。
2、開閉原則(Open Close Principle)
開閉原則就是說對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。所以一句話概括就是:為了使程序的擴展性好,易于維護和升級。想要達到這樣的效果,我們需要使用接口和抽象類。
3、里氏代換原則(Liskov Substitution Principle)
里氏代換原則面向對象設計的基本原則之一。 里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。 LSP是繼承復用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為。里氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關系就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規范。—— From Baidu 百科
4、依賴倒轉原則(Dependence Inversion Principle)
這個是開閉原則的基礎,具體內容:真對接口編程,依賴于抽象而不依賴于具體。
5、接口隔離原則(Interface Segregation Principle)
這個原則的意思是:使用多個隔離的接口,比使用單個接口要好。還是一個降低類之間的耦合度的意思,從這兒我們看出,其實設計模式就是一個軟件的設計思想,從大型軟件架構出發,為了升級和維護方便。所以上文中多次出現:降低依賴,降低耦合。
6、迪米特法則(最少知道原則)(Demeter Principle)
為什么叫最少知道原則,就是說:一個實體應當盡量少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立。
常用設計模式一覽:
名稱 | 定義 | 設計原則 | 例子 |
---|---|---|---|
策略模式 | 定義算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。 | 1.封裝變化。 2.多用組合,少用繼承。 3.針對接口編程,不針對實現編程。 |
策略模式1 <br /> <br /> 策略模式2 |
觀察者模式 | 在對象之間定義一對多的依賴,這樣一來當一個對象改變狀態,依賴它的對象都會收到通知,并自動更新。 | 為了交互對象之間的松耦合設計而努力。 | 觀察者模式 |
裝飾者模式 | 動態的將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。 | 對擴展開放,對修改關閉。 | 裝飾者模式 |
工廠方法模式 | 定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。 | 依賴抽象,不要依賴具體類。(依賴倒置) | 工廠方法模式1 <br /> <br /> 工廠方法模式2 |
抽象工廠模式 | 提供了一接口,用于創建相關或依賴對象的家族,而不需要明確指定具體類。 | 同上 | 抽象工廠模式 |
單例模式 | 確保一個類只有一個實例,并提供一個全局訪問點。 | - | 單例模式 |
命令模式 | 將請求封裝成對象,這可以讓你使用不同的請求,隊列,或者日志請求來參數化其他對象。命令模式也可以支持撤銷工作。 | - | 命令模式 |
適配器模式 | 將一個類的接口,轉換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。 | - | 適配器模式 |
外觀模式 | 提供了一個統一的接口,用來訪問子系統中的一群接口。外觀定義了一個高層接口,讓子系統更容易使用。 | 最少知識原則(德墨忒爾法則):只和你的密友談話。 | 外觀模式 <br /> <br /> 注:適配器將一個對象包裝起來以改變其接口;裝飾者將一個對象包裝起來以增加新的行為和責任;而外觀將一群對象“包裝”起來以簡化其接口。 |
模板方法模式 | 在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。 | 好萊塢原則:別調用(打電話給)我們,我們會調用(打電話給)你。 | 模板方法模式 |
迭代器模式 | 提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露其內部的表示。 | 一個類應該只有一個引起變化的原因。 | 迭代器模式 |
組合模式 | 允許你將對象組成樹形結構來表現“整體/部分”的層次結構。組合能讓客戶以一致的方式處理個別對象和對象組合。 | - | 組合模式 |
狀態模式 | 允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。 | - | 狀態模式 |
代理模式 | 為另一個對象提供一個替身或占位符以控制對這個對象的訪問。 | - | 靜態代理 <br /> <br /> 動態代理 |