1、模式的定義:模式是在某情景(context)下,針對某問題的某種解決方案。(另解:另若是你發現本身處於某個情景下,面對着所欲達到的目標被一羣約束影響着的問題,然而,你可以應用某個設計,克服這些約束並達到該目標,將你領向某個解決方案。)算法
情景就是應用某個模式的狀況,這應該是會不斷出現的狀況。設計模式
問題就是你想在某情景下達到的目標,但也能夠是某情景下的約束。ui
解決方案就是你所追求的:一個通用的設計,用來解決約束,達到目標。spa
模式 | 簡要描述 |
裝飾者 | 包裝一個對象,以提供新的行爲 |
狀態 | 封裝了基於狀態的行爲,並使用委託在行爲之間切換 |
迭代器 | 在對象的集合之中游走,而不暴露集合的實現 |
外觀 | 簡化一羣類的接口 |
策略 | 封裝能夠互換的行爲,並使用委託來決定要使用哪個 |
代理 | 包裝對象,以控制對此對象的訪問 |
工廠方法 | 由子類決定要建立的具體類是哪個 |
抽象工廠 | 容許客戶建立對象的家族,而無需指定他們的具體類 |
適配器 | 封裝對象,並提供不一樣的接口 |
觀察者 | 讓對象可以在狀態改變時被通知 |
模版方法 | 由子類決定如何實現一個算法中的步驟 |
組合 | 客戶用一致的方式處理對象集合和單個對象 |
單例 | 確保有且只有一個對象被建立 |
命令 | 封裝請求成爲對象 |
2、在大多數的模式類目中,模式一般根據某種作法被歸爲幾類。prototype
最廣爲認知的分類方式是根據模式的目標分紅三個不一樣類目:建立型,行爲型和結構型。設計
類別 | 成員 |
建立型模式涉及到將對象實例化,這類模式都提供一個方法,將客戶從所須要實例化的對象中解耦。 | 單例(singleton),建造(builder),原型(prototype),抽象工廠(abstract factory),工廠方法(factory method) |
行爲型模式,涉及到類和對象如何交互及分配職責。 | 中介者(mediator),訪問者(visitor),模板方法(template method),迭代器(iterator),命令(command),備忘錄(memento),解釋器(interpreter),觀察者(Observer),職責鏈(chain of responsibility) |
結構型模式可讓你把類或者對象組合到更大的結構中。 | 代理(proxy),裝飾(decorator),外觀(facade),組合模式(composite),適配器(adapter),橋接(bridge),享元(flyweight) |
還有另外一種分類方式:類模式和對象模式代理
類別 | 成員 |
類模式描述類之間的關係如何經過繼承定義。類模式的關係是在編譯時創建的。 | 模板方法(template method),工廠方法(factory method),適配器(adapter),解釋器(interpreter) |
對象模式描述對象sd的關係,並且主要是利用組合定義。對象模式的關係一般在運行時創建,並且更加動態、更有彈性。 | 單例(singleton),建造(builder),原型(prototype),抽象工廠(abstract factory),中介者(mediator),訪問者(visitor),迭代器(iterator),命令(command),備忘錄(memento),解釋器(interpreter),觀察者(Observer),職責鏈(chain of responsibility),代理(proxy),裝飾(decorator),外觀(facade),組合模式(composite),橋接(bridge),享元(flyweight)server |
3、模式不是萬能的,使用時多思考,用模式思考:對象
一、保持簡單。當你設計時,儘量的用簡單的方式解決問題。你的目標應該是簡單,而不是」如何在這個問題中應用模式「。繼承
二、設計模式非萬靈丹,事實上,連什麼丹都算不上。你須要考慮到模式對你的設計中其餘部分所形成的後果。
三、你要知道什麼時候須要模式。當你在設計的時候,若是肯定在你的設計中能夠利用某個模式解決某個問題,那麼就使用這個模式!若是有更簡單的解決方案,那麼在決定使用模式以前應該先考慮這個方案。
四、重構的時間就是模式的時間。重構就是經過改變你的代碼來改進它的組織方式的過程。目標是要改善其結構,而不是其行爲。這是一個很好的時機,能夠從新檢查你的設計來看看是否可以利用模式讓它擁有更好的結構。
五、拿掉你所不須要的模式,不要懼怕將一個設計模式從你的設計中刪除。
六、若是你如今不須要模式,就別作。