天天看點

設計模式彙總

一,概念:

設計模式是一種被重複使用,被很多人知曉,經過分類,代碼設計經驗的總結。

是一種優雅的代碼實作,能夠便于他人了解,能夠适應需求不斷變化的經驗總結。

很多的場景是,前期的需求比較簡單,簡單的實作,但是随着系統的豐富完善,簡單的實作方式越來越臃腫,修改的代價越來越大時,再重構的過程中,使用設計模式,可以減小系統的複雜性。

一共23種設計模式。

建立型模式(5種):

   工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式(7種):

   擴充卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

行為型模式(11種):

   政策模式、模闆方法模式、觀察者模式、疊代器模式、責任鍊模式、指令模式、備忘錄模式、狀态模式、通路者模式、中介者模式、解釋器模式。

二,逐一說明

建立型

① 工廠模式:通過接口定義規範,有多個不同的接口實作,通過給工廠類傳入參數,獲得不同接口實作。這樣如果需要新增或者替換實作,隻需要修改工程類。

需要注意的是,簡單的對象可以直接new,如果使用工程方法,就會增加類,并且增加代碼複雜度。

② 抽象工廠模式:抽象工廠模式是對工程模式的再封裝,工廠模式是對工廠類直接new,抽象工廠模式是更複雜的對象,比如qq換皮膚,會涉及到更多的更改,對工廠本身也做了抽象化。

③ 單例模式:避免全局的對象頻繁的建立,保證每次請求都是拿到的同一個執行個體。

④ 建造者模式:一個複雜對象的建構,可能由多個子系統各自建立并且組裝建構,建造者模式将子系統各自建立群組裝分開,适用于子系統變化大,而組裝建構基本穩定的場景。(比如去肯德基點餐,一個套餐組合過程不會有太大的變化,但是套餐裡的産品會有較大的不同)

⑤ 原型模式:原型模式就是一個複雜對象如果建立的開銷較大,那麼可以利用clone來複制一份對象,Java中需要clone的類實作Cloneable接口重寫clone方法,ShapeCache可以把對象緩存起來,使用時候直接從緩存中拿到,減小開銷。

結構型

⑥ 擴充卡模式:如果有一個接口,不能完全滿足客戶的需求,在不改動原有代碼的情況下,做一個擴充卡,來使得接口滿足客戶需求,解決接口之前的相容性。比如讀卡器,解決了記憶體卡和pc之間的問題。

⑦ 裝飾器模式:動态的給一個現有的對象添加一些功能,裝飾類和現有的對象一樣實作同一個接口,并且把目前對象注入到裝飾類中,這樣裝飾類能夠調用對象,并且動态的添加功能。

⑧ 代理模式:一個類代替另外一個類來為其他對象提供服務,在調用者是不清楚實際類的存在的。

⑨ 外觀模式:隐藏系統的複雜性,并且為用戶端提供統一的界面。比如啟動電腦需要啟動cpu,memory,disk,如果暴露給用戶端需要逐一的啟動,但是如果聲明一個computer,提供給用戶端一個computer的啟動方法,對于cpu等的啟動在内部實作,就隐藏了複雜性,減小了耦合度。

⑩ 橋接模式:系統可能有多元度的變化,比如有顔色,形狀次元多可能的變化,将抽象部分和實作部分分開,使他們可以獨立的變化。

組合模式:又稱整體部分模式,使得使用者對單個對象以及組合對象有一緻性,多用于對樹的操作,比如樹節點有父節點,子節點的集合。

 享元模式:将對象緩存起來,避免頻繁的建立銷毀對象造成的開銷。用于對象池,連接配接池等。

行為性:

政策模式:有很多算法相似,但是行為略有不同,如果使用if else會增加較多的維護成本,講每一個算法都封裝成獨立的類,有政策類來調用。比如電腦的加減乘除都是相似的算法,可以把不同的算法進行不同的封裝。

模闆方法模式:抽象類完成功能的骨架,通用性的代碼,差異性的部分定義成抽象方法,由不同的子類去實作,如此完成通用代碼的重用,以及差異個性化的代碼各自實作。比如解析全國各地的xml計價檔案,流程大緻相似,各地的差異化各自實作。

觀察者模式:一個對象狀态改變時,同時通知對此對象有依賴的所有對象。被觀察者維護所有觀察者的集合,觀察者者實作統一的相應接口,這樣當被觀察者變化時,能夠周遊的通知觀察者做出響應。

疊代器模式:封裝了對對象的周遊,提供自己的方法,而不需要暴露對象内部的結構。比如iterator

責任鍊模式:一個請求處理,每一個接收方都包含下一個接收方的資訊,形成一條鍊,知道找到能夠處理該請求的方法。解耦發送者和接收者,隻需要把請求給接收者,不管具體鍊上的那個方法處理請求。

指令模式:定義指令接口,不同的指令分别實作這個接口,将每一個請求都封裝成對象,消息的發送者和接受者,都是對對象操作,新增指令也比較容易。各種指令形式的場景都可以使用指令模式。

備忘錄模式:在不破壞原對象封裝的情況下,可以對對象進行備份,随時可以對對象進行恢複。打遊戲存檔,資料庫的事務都是用類似的模式。

狀态模式:代碼中有大量的狀态的語句,并且不同狀态有不通過的行為的情況。将不同的狀态進行封裝,同時實作一個狀态的接口,實作一個統一的行為方法。即每一種狀态可以注入上下文,方式的變化。

21 通路者模式:一個對象要做不相關的幾個類的操作,為了不污染這幾個類,這幾個類分别繼承一個接受通路者對象的接口,這樣多個對象保持原有的結構,對象和各個類的關系都在通路者對象中操作。

22 中介者模式:多個對象之間如果互相引用,那麼會形成網狀關系,如果一個對象修改,那麼相關的都需要改。中介者模式,就是形成一個公共的中介者,所有的對象是星狀關系,各個對象隻和中介有關系,不用和其他對象直接關聯。

23 解釋器模式:指定一種語言,并且提供解析語言的表達式。

本文轉自 斯然在天邊 51CTO部落格,原文連結:http://blog.51cto.com/13172906/1956496,如需轉載請自行聯系原作者