結構模式算法
行爲模式數據庫
爲何可重用的設計模式?編程
一個設計......
...能夠靈活地改變(可重用性)
...在修復舊問題時儘可能減小引入新問題(可維護性)
...容許在初次交付以後交付更多功能(可擴展性)。設計模式
設計模式:軟件設計中給定上下文中常見問題的通用,可重用解決方案。
OO設計模式典型地顯示類或對象之間的關係和交互,而不指定涉及的最終應用程序類或對象。 除了類自己,設計模式更強調多個類/對象之間的關係和交互過程---比接口/類複用的粒度更大數據結構
設計模式分類併發
創造性模式框架
結構模式學習
行爲模式測試
適配器模式(delegation)設計
適配器模式
意圖:將類的接口轉換爲客戶指望得到的另外一個接口。將某個類/接口轉換爲客戶指望的其餘形式
對象:將舊組件重用到新系統(也稱爲「包裝器」)
裝飾器模式(subtyping and delegation)
使用裝飾器模式的例子
假設你想要一個堆棧數據結構的各類擴展......
和任意可組合的擴展名:
裝飾器
問題:您須要對單個對象進行任意或動態組合的擴展。爲對象增長不一樣側面的特性
解決方案:實現通用接口做爲要擴展的對象,添加功能,但將主要職責委託給基礎對象。 對每個特性構造子類,經過委派機制增長到對象上
後果:
裝飾者同時使用子類型和委派
裝飾與繼承
裝飾者在運行時組成功能
裝飾者由多個協做對象組成
能夠混合搭配多重裝飾
外觀模式
問題:客戶端社區的一部分須要一個簡化的界面來實現複雜子系統的總體功能。
即客戶端須要經過一個簡化的接口來訪問複雜系統內的功能
意圖提供一個統一的接口來取代一系列小接口調用,至關於對複雜系統作了一個封裝,簡化客戶端使用
這減小了成功利用子系統所需的學習曲線。便於客戶端學習使用,解耦
它還促進了子系統與潛在的許多客戶的解耦。
外觀模式示例
假設咱們有一組具備接口的應用程序來使用MySql / Oracle數據庫並生成不一樣類型的報告,如HTML報告,PDF報告等。
因此咱們將有不一樣的接口集合來處理不一樣類型的數據庫。
如今,客戶端應用程序可使用這些接口來獲取所需的數據庫鏈接並生成報告。
可是,當複雜性增長或界面行爲名稱混淆時,客戶端應用程序將難以管理它。
因此咱們能夠在這裏應用Facade模式,並在現有接口的頂部提供一個包裝接口來幫助客戶端應用程序。
策略模式
問題:針對特定任務存在不一樣的算法,但客戶端能夠根據動態上下文在運行時切換算法。
示例:對客戶列表進行排序(冒泡排序,合併排序,快速排序)
解決方案:爲算法建立一個接口,併爲算法的每一個變體實現一個類。
優勢:
模板方法
問題:多個客戶共享相同的算法,但具體細節不一樣,即算法由可定製的部分和不變的部分組成。 常見的步驟不該該在子類中重複,但須要從新使用。
例子:
解:
模板方法模式
模板方法模式使用繼承+可重寫方法來改變算法的一部分使用繼承和重寫實現模板模式
模板方法普遍用於框架
迭代器模式
問題:客戶須要統一策略來訪問容器中的全部元素,而與容器類型無關
解決方案:迭代的策略模式
後果:
模式結構
結構模式
行爲模式