設計模式專輯——概覽

 

1.前言html

  寫這個東西的目的,主要是爲了本身能更好的掌握,而且靈活應用模式。其實你們在平時工做中有意無心的會用到不少模式,但並無仔細總結梳理,因此也是藉此機會對以往開發設計作些總結、思考。java

  那麼,因爲設計模式的資料太多,解讀各異,部分模式的解釋很是模糊,使人費解。爲了統一標準,這裏參考維基百科做爲基準。維基百科中已經對每一個模式都作了詳細的說明,並且相關資料也很豐富,因此不會對每一個模式都進行展開。git

  文中參考維基百科將各個模式根據設計目的進行整理成表,以方便未來根據應用場景快速查找使用。github

  在學習和使用以前,最好能下載下面提供的例子,github上的這些例子寫地很是好,很直觀。先把例子跑起來運行下,可以更好的理解這些模式。不過,例子有時候也會誤導咱們。一個例子爲了能正常運行起來,不得不包含一個完整程序所須要的各個角色,這裏面的部分角色其實並非該設計模式所關注的,這就致使了咱們對模式關注點的誤解。因此理解的時候要注意一個模式的邊界在哪裏。一樣的,類圖並不能體現設計者的所有意圖,也會帶有誤導性,尤爲是特徵相近的幾個模式,單從類圖上是看不出區別的。有的時候,簡單的從模式的名字出發,站在抽象的高度去理解反而更簡單些(名字不是隨便取的,它包含了設計者和總結者的深度思考和理解)。算法

  另外這系列文章論述的概念比較抽象,須要閱讀者有必定的開發設計經驗,對各個模式有必定的瞭解,在閱讀以前最好先過一遍各個模式。設計模式

2.相關資料微信

  維基百科:https://en.wikipedia.org/wiki/Software_design_pattern (維基對各個模式的梳理比較詳細) app

  GoF設計模式:https://en.wikipedia.org/wiki/Design_Patterns (Gof【Gang of Four】指《設計模式》的四位做者,他們概括了最廣爲人知的23種設計模式)框架

  相關例子:https://github.com/iluwatar/java-design-patterns (這裏有不少例子,能夠直接拿來使用)函數

 

3.速查表

 

建立型模式
名稱 目的  
抽象工廠(Abstract factory)
  • 提供一個接口,用於建立相關或從屬對象的族,而不須要指定它們的具體類。經過選擇具體的工廠,就選定了一族對象。
  • 它提供了多個工廠方法。
建造者 (Builder)
  • 經過同一個構建過程,建立不一樣表現形式的複雜對象
  • 簡化包含複雜構建邏輯的類
  • 具備統一的構建過程。
依賴注入 (Dependency Injection)
  • 類從注入器接受它須要的對象,而不是直接建立對象。
  • 主動傳遞依賴的對象給使用者,而不是讓使用者去發現或建立依賴對象。
  • 經過配置決定依賴對象的建立
工廠方法 (Factory Method)
  • 定義用於建立單個對象的接口,但讓子類決定要實例化哪一個類。工廠方法容許類將實例化推遲到子類
 
延遲初始化 (Lazy Initialization)
  • 延遲建立對象、計算值或其餘一些昂貴過程的策略,直到第一次須要它爲止。
  • 延遲初始化這種策略在不少地方都有應用,某些單例模式也會應用到延遲初始化。
多例 (Multition)
  •  確保類只有被命名的少數幾個實例,並提供對它們的全局訪問點。
  • 多例模式是單例模式的推廣,對外提供了某個類的指定個數的實例。這些實例一般具備對應的名稱,並使用Map進行維護。使用時經過名稱獲取對應實例。
對象池 (Object pool)
  • 經過回收再也不使用的物品來避免昂貴的資源獲取和釋放。能夠認爲是鏈接池和線程池模式的歸納。
  •  對象池很是常見,好比鏈接池、線程池。
原型 (Prototype)
  • 使用原型實例指定要建立的對象的類型,並從現有對象的「骨架」建立新對象,從而提升性能並將內存佔用保持在最低水平
  • 一般在你須要使用到某個已經存在的對象,但又不但願對外暴露它的狀況下(一般是爲了防止被修改),會使用原型模式對該對象進行拷貝,提供一個副本給外面使用。Java中實現原型模式須要實現Cloneable接口,這裏須要區分淺複製和深複製。

單例 (Singleton)

  • 確保一個類只有一個實例,並提供對它的全局訪問點
 
 結構型模式

適配器 (Adapter,Wrapper or Translator)

  • 將類的接口轉換爲客戶機指望的其餘接口。適配器容許類一塊兒工做,不然因爲接口不兼容而沒法一塊兒工做
 

橋接 (Bridge)

  • 將抽象從其實現中分離出來,從而容許二者獨立變化
 
複合(Composite)
  • 將對象組合成樹結構以表示部分總體層次結構。組合容許客戶機統一處理單個對象和對象的組合
  • 樹形結構
  • 部分和總體繼承相同的接口
裝飾器(Decorator)
  • 動態地將額外的職責附加到對象上,以保持相同的接口。爲擴展功能提供了靈活的子類化替代方案
  • 經過構造函數將real object傳入裝飾器,裝飾器在調用real object前或後添加邏輯
  • 裝飾器和real object繼承相同接口
外觀 (Facade)
  • 爲子系統中的一組接口提供統一的接口。Facade定義了一個更高級的接口,使子系統更容易使用
  •  將一個複雜系統封裝到一個接口類中,調用者只看到這個接口類,使用該類便可完成複雜的系統調用
享元 (Flyweight)
  • 使用共享來支持大量類似的對象
 http://www.cnblogs.com/zhenyulu/articles/55793.html
標記(Marker)
  • 用於將元數據與類關聯的空接口
  • 定義一個具備某種含義的接口,繼承了該接口就帶上了這種含義。經過判斷是否繼承這個接口來區別對待不一樣對象。這個接口就是一種標記。
代理(Proxy)
  • 爲另外一個對象提供代理項或佔位符,以控制對它的訪問
 
耦合(twin)
  • 在不支持多繼承的語言中,作相似多繼承的事
  • 經過引入實現了目標接口的對象來獲取目標接口的功能
行爲型模式
責任鏈(Chain of responsibility)
  • 經過給多個對象處理請求的機會,避免將請求的發送者與其接收者耦合。連接接收對象並沿鏈傳遞請求,直到對象處理它

  •  好比:過濾器
命令模式(Command)
  • 將請求封裝爲一個對象,從而容許對具備不一樣請求的客戶機進行參數化,以及對請求進行排隊或記錄。它還容許支持撤銷操做
  • 封裝請求
  • 按順序記錄歷史請求
解釋器模式(Interpreter)
  • 用於定義和解析表達式
 
中介者模式(Mediator)
  • 定義一個對象,它封裝一組對象如何交互。中介器經過防止對象明確地相互引用來促進鬆耦合,並容許它們的交互獨立變化
  • 中介中含有全部須要交互的對象的引用
  • 交互的對象之間不直接引用,而引用中介
備忘錄(Memento)
  • 在不違反封裝的狀況下,捕獲對象的內部狀態並將其外部化,以便稍後將對象還原到此狀態。
  • 把對象可變的狀態用另外一個類封裝起來(外部化),記錄歷史狀態對象,以便恢復歷史狀態
空對象(Null object)
  • 經過提供一個默認對象來避免空指針
 
觀察者(Observer or Publish/subscribe)
  • 定義對象之間的一對多依賴關係,其中一個對象中的狀態更改會自動通知和更新其全部依賴項
 
僱工模式(Servant)
  • 提供通用的功能,一般稱爲工具類,通常沒有實例,方法都是靜態的
 
規約模式(Specification)
  • 以布爾方式從新組合業務邏輯

 
狀態模式(State)
  • 容許對象在其內部狀態更改時更改其行爲。對象將顯示爲更改其類。
  • 抽象出狀態類,裏面包含狀態對應的行爲,把行爲和狀態綁定在一塊兒
策略模式(Strategy)
  • 定義一組封裝好的,互相可替換的算法,使算法和使用它的客戶端之間互相獨立
 
模板方法(Template Method)
  • 在操做中定義算法的框架,將一些步驟推遲到子類。模板方法容許子類在不改變算法結構的狀況下從新定義算法的某些步驟。
  • 父類定義算法框架,抽象出步驟,控制好步驟執行順序。子類實現具體步驟中的操做。
訪問者(Visitor)
  • 表示要對對象結構的元素執行的操做。Visitor容許定義一個新的操做,而不更改其操做的元素的類。
  • Visitor中包含對全部元素的相應的操做,增長一個Visitor至關於增長一組操做。

 

 

 

喜歡的話能夠打賞一下哦!!!

支付寶

微信

相關文章
相關標籤/搜索