第5章:可重用性的軟件構建方法 5.3面向複用的設計模式

大綱

結構模式算法

  • Adapter容許具備不兼容接口的類經過將本身的接口包裝到已有類的接口中來一塊兒工做。
  • Decorator動態添加/覆蓋對象的現有方法中的行爲。
  • Facade爲大量代碼提供簡化的界面。

行爲模式數據庫

  • 策略模式(Strategy)容許在運行時即時選擇一個算法族中的一個。
  • 模板(Template)方法將算法的骨架定義爲抽象類,容許其子類提供具體行爲。
  • 迭代器(Iterator)依次訪問對象的元素而不暴露其基礎表示。

爲何可重用的設計模式?編程

一個設計......
...能夠靈活地改變(可重用性)
...在修復舊問題時儘可能減小引入新問題(可維護性)
...容許在初次交付以後交付更多功能(可擴展性)。設計模式

設計模式:軟件設計中給定上下文中常見問題的通用,可重用解決方案。
OO設計模式典型地顯示類或對象之間的關係和交互,而不指定涉及的最終應用程序類或對象。 除了類自己,設計模式更強調多個類/對象之間的關係和交互過程---比接口/類複用的粒度更大數據結構

設計模式分類併發

創造性模式框架

  • 關注對象建立的過程

結構模式學習

  • 處理類或對象的構成

行爲模式測試

  • 描述類或對象交互和分配責任的方式。

結構模式

(1) Adapter

適配器模式(delegation)設計

適配器模式
意圖:將類的接口轉換爲客戶指望得到的另外一個接口。將某個類/接口轉換爲客戶指望的其餘形式

  • 適配器容許類一塊兒工做,不然由於不兼容的接口而沒法工做。
  • 使用新界面包裝現有課程。 經過增長一個接口,將已存在的子類封裝起來,客戶端面向接口編程,從而隱藏了具體子類。

對象:將舊組件重用到新系統(也稱爲「包裝器」)

(2) Decorator

裝飾器模式(subtyping and delegation)

使用裝飾器模式的例子
假設你想要一個堆棧數據結構的各類擴展......

  • UndoStack:一個堆棧,可讓你撤銷先前的推送或彈出操做
  • SecureStack:須要密碼的堆棧
  • SynchronizedStack:串行化併發訪問的堆棧

和任意可組合的擴展名:

  • SecureUndoStack:須要密碼的堆棧,還可讓您撤銷先前的操做
  • SynchronizedUndoStack:一個序列化併發訪問的堆棧,也可讓你撤消之前的操做
  • SecureSynchronizedStack:...
  • SecureSynchronizedUndoStack:...

裝飾器

問題:您須要對單個對象進行任意或動態組合的擴展。爲對象增長不一樣側面的特性
解決方案:實現通用接口做爲要擴展的對象,添加功能,但將主要職責委託給基礎對象。 對每個特性構造子類,經過委派機制增長到對象上
後果:

  • 比靜態繼承更靈活
  • 可定製的,有凝聚力的擴展

裝飾者同時使用子類型和委派

裝飾與繼承

裝飾者在運行時組成功能

  • 繼承在編譯時組成功能

裝飾者由多個協做對象組成

  • 繼承產生一個明確類型的對象

能夠混合搭配多重裝飾

  • 多重繼承在概念上是困難的

(3) Facade

外觀模式

問題:客戶端社區的一部分須要一個簡化的界面來實現複雜子系統的總體功能。
即客戶端須要經過一個簡化的接口來訪問複雜系統內的功能
意圖提供一個統一的接口來取代一系列小接口調用,至關於對複雜系統作了一個封裝,簡化客戶端使用

  • 爲子系統中的一組接口提供統一接口。 Facade定義了一個更高級別的界面,使得子系統更易於使用。
  • 用更簡單的界面包裝一個複雜的子系統。

這減小了成功利用子系統所需的學習曲線。便於客戶端學習使用,解耦
它還促進了子系統與潛在的許多客戶的解耦。

外觀模式示例

假設咱們有一組具備接口的應用程序來使用MySql / Oracle數據庫並生成不一樣類型的報告,如HTML報告,PDF報告等。
因此咱們將有不一樣的接口集合來處理不一樣類型的數據庫。
如今,客戶端應用程序可使用這些接口來獲取所需的數據庫鏈接並生成報告。
可是,當複雜性增長或界面行爲名稱混淆時,客戶端應用程序將難以管理它。
因此咱們能夠在這裏應用Facade模式,並在現有接口的頂部提供一個包裝接口來幫助客戶端應用程序。

行爲模式

(1) Strategy

策略模式

問題:針對特定任務存在不一樣的算法,但客戶端能夠根據動態上下文在運行時切換算法。
示例:對客戶列表進行排序(冒泡排序,合併排序,快速排序)
解決方案:爲算法建立一個接口,併爲算法的每一個變體實現一個類。
優勢:

  • 易於擴展新算法實現
  • 從客戶端上下文中分離算法

(2) Template Method

模板方法

問題:多個客戶共享相同的算法,但具體細節不一樣,即算法由可定製的部分和不變的部分組成。 常見的步驟不該該在子類中重複,但須要從新使用。

  • 作事情的步驟同樣,但具體方法不一樣

例子:

  • 執行一組測試用例
  • 打開,閱讀,編寫不一樣類型的文件

解:

  • 算法的常見步驟被分解爲抽象類,抽象(未實現)基本操做表明算法的可定製部分。共性的步驟在抽象類內公共實現,差別化的步驟在各個子類中實現
  • 子類爲每一個步驟提供不一樣的實現。

模板方法模式

模板方法模式使用繼承+可重寫方法來改變算法的一部分使用繼承和重寫實現模板模式

  • 然而策略模式使用委託來改變整個算法(接口和ad-hoc多態性)。

模板方法普遍用於框架

  • 該框架實現算法的不變量
  • 客戶端自定義爲算法提供專門的步驟
  • 原則:「不要打電話給咱們,咱們會打電話給你」。

(3) Iterator

迭代器模式

問題:客戶須要統一策略來訪問容器中的全部元素,而與容器類型無關
解決方案:迭代的策略模式
後果:

  • 隱藏底層容器的內部實現
  • 支持統一接口的多種穿越策略
  • 易於更改容器類型
  • 促進計劃各部分之間的溝通

模式結構

  • 抽象迭代器類定義遍歷協議
  • 每一個聚合類的具體迭代器子類
  • 聚合實例建立Iterator對象的實例
  • 聚合實例保持對Iterator對象的引用

總結

結構模式

  • 適配器容許具備不兼容接口的類經過將本身的接口包裝到已有類的接口中來一塊兒工做。
  • 裝飾器動態添加/覆蓋對象的現有方法中的行爲。
  • 外觀模式爲大量代碼提供簡化的界面。

行爲模式

  • 策略模式容許在運行時即時選擇一個算法族中的一個。
  • 模板方法將算法的骨架定義爲抽象類,容許其子類提供具體行爲。
  • 迭代器依次訪問對象的元素而不暴露其基礎表示。
相關文章
相關標籤/搜索