僅爲了軟考需要,整理文檔,供自己複習使用
一 設計模式分爲三大類:
創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
二 各種設計模式:
1 單例模式
2 工廠模式
工廠方法,只有一個抽象的方法,由子類完成實例化。抽象工廠,有抽象多個方法。這是2個的主要區別。
簡單工廠 extends 抽象工廠或者工廠方法,不能稱爲模式。而抽象工廠或者工廠方法可以稱爲模式,因爲可以重用,被當成模板。
3 建造者模式(builder)
java中應用:
StringBuffer:線程安全,StringBuilder:性能好
4 原型模式 (prototype)
通過"複製"一個已經存在的實例來返回新的實例,而不是新建實例。被複制的實例就是我們所稱的"原型",這個原型是可以定製的。
1 跟JVM有關 2 implements cloneable 3 ovveride clone()
使用場景:原型模式多用於創建複雜的或耗時的實例,因爲這種情況下,複製一個已經存在的實例使程序運行更高效;或者創建值相等,只是命名不一樣的同類數據。原型模式的關注點在於大量相似對象的創建。
5 適配器模式(Adapter)
將一個類的接口轉換成客戶希望的另外一個接口
6 裝飾者模式(Decorator),又稱包裝(Wrapper)模式
動態地給一個類添加一些額外的職責.不同裝飾者可相容,彼此透明。基於現有方法的擴展。
7 代理模式(Proxy)
爲其他對象提供一種代理以控制對這個對象的訪問。
8 外觀模式(facade)
"接口簡化",爲子系統中的一組接口提供一個一致的對外接口。處理客戶與系統間的關係,單向。(與中介者對比)。用單個對象表示整個系統。
應用場景:
1)爲一個複雜子系統提供一個簡單接口。
2)提高子系統的獨立性,實現松耦合。
3)在層次化結構中,可以使用Facade模式定義系統中每一層的入口。
參考:http://www.cnblogs.com/devinzhang/archive/2012/01/06/2315200.html
9 橋接模式(bridge)
把抽象部分和實現部分分離,使它們都可以獨立的變化。
應用場景:
(1)不希望在抽象及抽象的實現部分之間有一個固定的綁定關係。
(2)類的抽象及它的實現都應該可以通過生成子類的方法加以擴充,使用橋接模式可以對不同的抽象接口和實現部分進行組合,並分別對它們進行擴充。
(3)對一個抽象的實現部分修改應該對用戶不產生影響,即客戶的代碼不必重新編譯。
參考:http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562010111843618596/
http://www.blogjava.net/qileilove/archive/2012/12/05/392498.html
10 組合模式(composite)
將對象以樹形結構組織起來,以達成“部分-整體” 的層次結構,使得客戶端對單個對象和組合對象的使用具有一致性.
11 享元模式(flyweight)
GoF對享元模式的描述是:運用共享技術有效地支持大量細粒度的對象。 Flyweight模式的有效性很大程度上取決於如何使用它以及在何處使用它。當以下情況成立時使用Flyweight模式: |
參考:http://www.cnblogs.com/itTeacher/archive/2012/12/20/2826058.html
http://hi.baidu.com/isswangqing/item/2af19d75decab32ed7a89cb8
12 策略模式(Strategy)
又叫算法簇模式,就是定義了不同的算法族,並且之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。
缺點
1.客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。2.造成很多的策略類。
解決方案:採用工廠方法。
http://www.cnblogs.com/mengdd/archive/2013/01/19/2867443.html
13 模板方法模式(Template Method)
模板方法模式是類的行爲模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。
14 觀察者模式
15 迭代子模式(Iterator)
迭代子模式又叫遊標(Cursor)模式,是對象的行爲模式。迭代子模式可以順序地訪問一個聚集中的元素而不必暴露聚集的內部表象(internal representation)。
優點
聚集類的設計簡單,不必對外提供遍歷api。
一個聚集對象可以同時有幾個迭代在進行中。
客戶端不必知道聚集的具體類型。就可以讀取和遍歷聚集對象。即使聚集對象的類型發生變化也不會影響客戶端的遍歷。
缺點
迭代子模式給客戶端一個聚集被順序化的錯覺
迭代子給出的聚集元素沒有類型特徵。(應用泛型可解決此問題)
http://blog.csdn.net/cheekis/article/details/4027124
16 責任鏈模式(Chain of Responsibility)
在責任鏈模式裏,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
17 命令模式(command)1:1關係
將請求封裝在對象中,這樣它可以作爲參數來傳遞,也可以被存儲在歷史列表或者以其他方式使用。
19 備忘錄模式(memento)
又稱標記(Token)模式,快照模式(Snapshot Pattern)。備忘錄對象是一個用來存儲另外一個對象內部狀態的快照(snapshot)的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態捕捉住,並外部化,存儲起來,從而可以在將來適合的時候把這個對象還原到存儲起來的狀態。備忘錄模式常常與命令模式和迭代子模式一同使用。
涉及三個角色:備忘錄(Memento)角色、發起人(Originator)角色、負責人(Caretaker)角色。
功能:
http://blog.csdn.net/fg2006/article/details/6575760
20 狀態模式(state)
允許一個對象在其內部狀態改變時改變它的行爲。這個對象看起來似乎修改了它的類
應用場景:如果需要在 1、不同的狀態(可能會對應相應的行爲), 2、不同的行爲; 間反覆進行切換,則應優先考慮狀態模式
21 訪問者模式(visitor)
目的是封裝一些施加於某種數據結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的數據結構則可以保持不變。屬性不變,方法擴展。不同訪問者不相容,操作替換。(與裝飾者對比)
22 中介者模式(mediator)
場景:集中負責維護對象模型的關係完整性 以及需要 封裝對象間交互方式的時候.
簡單點來說,將原來兩個直接引用或者依賴的對象拆開,在中間加入一個“中介”對象,使得兩頭的對象分別和“中介”對象引用或者依賴。將多對多關係變爲多對一,是系統與系統間的內部關係,雙向。(與外觀模式對比)
23 解釋器模式(Interpreter)
應用:如果一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述爲一個簡單語言中的句子。這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題。而且當文法簡單、效率不是關鍵問題的時候效果最好。