在閱讀其餘源碼的時候被好多設計模式卡主了,所以想的簡單的學習一下設計模式。前端
參考: <<大話設計模式>>與<<Java與模式>>。算法
設計模式(Design pattern)表明了最佳的實踐,一般被有經驗的面向對象的軟件開發人員所採用。設計模式是軟件開發人員在軟件開發過程當中面臨的通常問題的解決方案。這些解決方案是衆多軟件開發人員通過至關長的一段時間的試驗和錯誤總結出來的。
設計模式是一套被反覆使用的、多數人知曉的、通過分類編目的、代碼設計經驗的總結。使用設計模式是爲了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石同樣。項目中合理地運用設計模式能夠完美地解決不少問題,每種模式在現實中都有相應的原理來與之對應,每種模式都描述了一個在咱們周圍不斷重複發生的問題,以及該問題的核心解決方案,這也是設計模式能被普遍應用的緣由。編程
能夠分爲三大類:建立型模式(Creational Patterns)-5種、結構型模式(Structural Patterns)-7種、行爲型模式(Behavioral Patterns)-11種。另外還有另外一類設計模式:J2EE 設計模式。設計模式
序號 | 模式 & 描述 | 包括 |
---|---|---|
1 | 建立型模式 這些設計模式提供了一種在建立對象的同時隱藏建立邏輯的方式,而不是使用 new 運算符直接實例化對象。這使得程序在判斷針對某個給定實例須要建立哪些對象時更加靈活。 |
|
2 | 結構型模式 這些設計模式關注類和對象的組合。繼承的概念被用來組合接口和定義組合對象得到新功能的方式。 |
|
3 | 行爲型模式 這些設計模式特別關注對象之間的通訊。 |
|
4 | J2EE 模式 這些設計模式特別關注表示層。這些模式是由 Sun Java Center 鑑定的。 |
|
一、開閉原則(Open Close Principle)數據結構
開閉原則的意思是:對擴展開放,對修改關閉。在程序須要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。簡言之,是爲了使程序的擴展性好,易於維護和升級。想要達到這樣的效果,咱們須要使用接口和抽象類,後面的具體設計中咱們會提到這點。架構
二、里氏代換原則(Liskov Substitution Principle)學習
里氏代換原則是面向對象設計的基本原則之一。 里氏代換原則中說,任何基類能夠出現的地方,子類必定能夠出現。LSP 是繼承複用的基石,只有當派生類能夠替換掉基類,且軟件單位的功能不受到影響時,基類才能真正被複用,而派生類也可以在基類的基礎上增長新的行爲。里氏代換原則是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化,而基類與子類的繼承關係就是抽象化的具體實現,因此里氏代換原則是對實現抽象化的具體步驟的規範。ui
三、依賴倒轉原則(Dependence Inversion Principle)spa
這個原則是開閉原則的基礎,具體內容:針對接口編程,依賴於抽象而不依賴於具體。設計
四、接口隔離原則(Interface Segregation Principle)
這個原則的意思是:使用多個隔離的接口,比使用單個接口要好。它還有另一個意思是:下降類之間的耦合度。因而可知,其實設計模式就是從大型軟件架構出發、便於升級和維護的軟件設計思想,它強調下降依賴,下降耦合。
五、迪米特法則,又稱最少知道原則(Demeter Principle)
最少知道原則是指:一個實體應當儘可能少地與其餘實體之間發生相互做用,使得系統功能模塊相對獨立。
六、合成複用原則(Composite Reuse Principle)
合成複用原則是指:儘可能使用合成/聚合的方式,而不是使用繼承。
7. 單一職責原則
指在類層面,方法層面,接口層面的職能都是單一的。更準確的解釋是:就一個類而言,應該僅有一個引發它變化的緣由。
建立型:對類的實例化過程的抽象。(官方語言是五種:工廠、抽象工廠、單例、建造者、原型)
分爲類的建立模式和對象的建立模式兩種:
類的建立模式:使用繼承關係,把類的建立延遲到子類中,從而封裝了客戶端將獲得哪些具體類的信息,而且隱藏了這些類的實例是如何被建立和放在一塊兒的。
對象的建立模式:把對象的建立過程動態地委派給另外一個對象。
1.簡單工廠模式:一個簡單的工廠類根據類型建立不一樣的產品,傳入一個參數決定建立具體的產品。通常採用反射建立對象,擴展性更強。(一個 工廠建立多個產品)
2.工廠模式:具備一個抽象類工程和多個具體工廠,一個工廠建立一個或多個產品。好比WindowsButtonFactory生產WindowsButton,WindowsTextFactory生產WindowsText產品。
3.抽象工廠:具備一個抽象類工程和多個具體工廠,一個具體工廠生產一個具備相關聯的產品,好比WindowsFactory生產WindowsButton和WindowsText。
4.單例模式:一個系統只有一個實例,好比一個國家一個總統,一個地球,JDK的Runtime等。
5.建造者模式:它一點一點地建立出一個複雜的產品,而這個產品的組裝就發生在建造者角色內部。建造者模式的客戶端拿到的是一個完整的最後產品。當構造方法參數過多時使用建造者模式
6.原始模式:經過複製實現建立對象,最多見的是基於流的深複製。
結構模式:描述如何將類或者對象結合在一塊兒造成更大的結構。(官方語言是七種:適配器、合成、裝飾、代理、享元、門面、橋樑)
結構模式描述兩種不一樣的東西:類與類的實例。結構模式能夠分爲兩種:類的結構模式和對象的結構模式。
類的結構模式:使用繼承把類、接口等組合在一塊兒,以造成更大的結構。
對象的結構模式:把各類不一樣類型的對象組合在一塊兒以實現新的功能和方法。
1. 適配器模式:經過類適配器模式和對象適配器模式使本來因接口不匹配而沒法在一塊兒工做的兩個類可以在一塊兒工做。
2.合成模式:讓客戶端再也不區分操做的是樹枝對象仍是樹葉對象,而是以一個統一的方式來操做。
3.裝飾模式:以對客戶端透明的方式擴展對象的功能,是繼承關係的另外一個替代方案。
4.代理模式:給某一個對象提供一個代理對象,並由代理對象控制對原對象的引用。
5.享元模式:以共享的方式高效地支持大量的細粒度對象。能作到共享的關鍵是內蘊狀態和外蘊狀態。
6.門面模式:外部與一個子系統的通訊必須經過一個統一的門面對象進行就是門面模式
7.橋樑模式:一個軟件系統的抽象化和實現化之間使用組合/聚合關係而不是繼承關係,從而使二者能夠獨立地變化。
行爲模式:是對不一樣的對象之間劃分責任和算法的抽象化。(官方語言是十一種:不變模式不屬於官方的行爲模式,剩下的11個都是)
1.不變模式:一個對象的狀態在被建立以後就再也不變化。(這個不在官方的行爲模式中)
2.策略模式:準備一組算法,並將每個算法封裝到一個獨立的類中。這些具體類具備共同的接口,從而使得它們能夠相互轉換。
3.模板方法:準備一個抽象類,將部分邏輯以具體方法以及具體構造子的方法實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。
4.觀察者模式:又叫作發佈-訂閱模式。此模式定義一個一對多的依賴關係,讓多個觀察者同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知全部觀察者,使它們可以更新本身。
5.迭代子模式:迭代子模式能夠順序地訪問一個彙集中的元素而沒必要暴露彙集的內部表象。
6.責任鏈模式:不少對象由每個對象對其下家的引用而鏈接起來造成一條鏈。
7.命令模式:把一個請求或操做封裝到一個對象中。命令模式容許系統使用不一樣的請求把客戶端參數化,對請求排隊或者記錄請求日誌。能夠提供撤銷或恢復功能。
8.備忘錄模式:在不破壞封裝的條件下,將一個對象的狀態捕捉住,並外部化存儲起來,從而能夠在合適的時候把這個對象還原到存儲起來的狀態。
9.狀態模式:容許一個對象在其內部狀態改變的時候改變其行爲。
10.訪問者模式:封裝一些施加於某種數據結構元素之上的操做。一旦這些操做須要修改的話,接收這個操做的數據結構則能夠保持不變。
11.解釋器模式:給定一個語言,解釋器模式能夠定義出其文本的表示方法,並同時提供一個解釋器。
12.調停者模式:包裝了一系列對象相互做用的方式,使得這些對象沒必要互相明顯引用,從而實現鬆耦合。