前言
衆所周知,軟件設計模式一共有23種,從今天開始,每天一種設計模式,關鍵理解,重在實踐。
每種設計模式會結合uml圖及源碼去進行研究學習,以達到熟練掌握的目標。
設計原則
在學習設計模式前先了解一下軟件設計的一些基本原則,因爲所有的模式都是爲了匹配這些開發原則而設計的。
1. 單一職責原則(Single Responsibility Principle)
一個類只有一個引起它變化的原因,也就是隻有一個職責。每一個職責都是變化的一個軸線,如果一個類有一個以上的職責,這些職責就耦合在了一起。當一個職責發生變化時,可能會影響其它的職責,這樣的軟件結構是我們不提倡的。另外,多個職責耦合在一起,會嚴重影響代碼的複用性。
2. 開閉原則(Open-Close Principle)
開閉原則就是說對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。所以一句話概括就是:爲了使程序的擴展性好,易於維護和升級。想要達到這樣的效果,我們需要使用接口和抽象類。
3. 里氏代換原則(Liskov Substitution Principle)
里氏代換原則(Liskov Substitution Principle LSP)面向對象設計的基本原則之一。 里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。 LSP是繼承複用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被複用,而衍生類也能夠在基類的基礎上增加新的行爲。里氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規範。
4. 依賴倒轉原則(Dependence Inversion Principle)
所謂依賴倒置原則(Dependence Inversion Principle)就是要依賴於抽象,不要依賴於具體。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合。
實現開閉原則的關鍵是抽象化,並且從抽象化導出具體化實現,如果說開閉原則是面向對象設計的目標的話,那麼依賴倒轉原則就是面向對象設計的主要手段。
5. 接口隔離原則(Interface Segregation Principle)
這個原則的意思是:使用多個隔離的接口,比使用單個接口要好。還是一個降低類之間的耦合度的意思,從這兒我們看出,其實設計模式就是一個軟件的設計思想,從大型軟件架構出發,爲了升級和維護方便。
6. 合成複用原則(Composite Reuse Principle)
合成複用原則就是指在一個新的對象裏通過關聯關係(包括組合關係和聚合關係)來使用一些已有的對象,使之成爲新對象的一部分;新對象通過委派調用已有對象的方法達到複用其已有功能的目的。簡言之:要儘量使用組合/聚合關係,少用繼承。
7. 迪米特法則(Demeter Principle)
爲什麼叫最少知道原則,就是說:一個實體應當儘量少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立。也就是說一個軟件實體應當儘可能少的與其他實體發生相互作用。這樣,當一個模塊修改時,就會盡量少的影響其他的模塊,擴展會相對容易,這是對軟件實體之間通信的限制,它要求限制軟件實體之間通信的寬度和深度。
在瞭解了這幾類設計原則之後,會對我們之後學習設計模式起到如虎添翼的效果,可能有些原則這時還沒看懂,不過沒關係,我們會在之後的學習中更加了解設計原則的含義。
設計模式
設計模式共有23個,可分爲三大類:創建模式(5種),結構模式(7種),行爲模式(11種),我們一個一個來學習。
我把所有的源碼都放在了我的github上,有需要的同學自取,如果覺得還不錯的話請star一下該項目 :)
創建模式
抽象工廠模式 (Abstract Factory)
建造者模式 (Builder)
工廠方法模式 (Factory Method)
原型模式 (Prototype)
單例模式 (Singleton)
結構模式
適配器模式 (Adapter)
橋接模式 (Bridge)
組合模式 (Composite)
修飾模式 (Decorator)
外觀模式 (Facade)
享元模式 (Flyweight)
代理模式(Proxy)
行爲模式
責任鏈模式 (Chain of Responsibility)
命令模式 (Command)
解釋器模式 (Interpreter)
迭代器模式 (Iterator)
中介者模式 (Mediator)
備忘錄模式 (Memento)
觀察者模式(Observer)
狀態模式 (State)
策略模式 (Strategy)
模板方法模式(Template Method)
訪問者模式 (Visitor)