摘要:共性的步驟在抽象類內公共實現,差異化的步驟在各個子類中實現子類為每個步驟提供不同的實現。模板方法將算法的骨架定義為抽象類,允許其子類提供具體行為。迭代器依次訪問對象的元素而不暴露其基礎表示。
大綱
結構模式
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模式,并在現有接口的頂部提供一個包裝接口來幫助客戶端應用程序。
策略模式
問題:針對特定任務存在不同的算法,但客戶端可以根據動態上下文在運行時切換算法。
示例:對客戶列表進行排序(冒泡排序,合并排序,快速排序)
解決方案:為算法創建一個接口,并為算法的每個變體實現一個類。
優點:
易于擴展新算法實現
從客戶端上下文中分離算法
(2) Template Method模板方法
問題:多個客戶共享相同的算法,但具體細節不同,即算法由可定制的部分和不變的部分組成。 常見的步驟不應該在子類中重復,但需要重新使用。
做事情的步驟一樣,但具體方法不同
例子:
執行一組測試用例
打開,閱讀,編寫不同類型的文件
解:
算法的常見步驟被分解為抽象類,抽象(未實現)基本操作代表算法的可定制部分。共性的步驟在抽象類內公共實現,差異化的步驟在各個子類中實現
子類為每個步驟提供不同的實現。
模板方法模式
模板方法模式使用繼承+可重寫方法來改變算法的一部分使用繼承和重寫實現模板模式
然而策略模式使用委托來改變整個算法(接口和ad-hoc多態性)。
模板方法廣泛用于框架
該框架實現算法的不變量
客戶端自定義為算法提供專門的步驟
原則:“不要打電話給我們,我們會打電話給你”。
(3) Iterator迭代器模式
問題:客戶需要統一策略來訪問容器中的所有元素,而與容器類型無關
解決方案:迭代的策略模式
后果:
隱藏底層容器的內部實現
支持統一接口的多種穿越策略
易于更改容器類型
促進計劃各部分之間的溝通
模式結構
抽象迭代器類定義遍歷協議
每個聚合類的具體迭代器子類
聚合實例創建Iterator對象的實例
聚合實例保持對Iterator對象的引用
總結結構模式
適配器允許具有不兼容接口的類通過將自己的接口包裝到已有類的接口中來一起工作。
裝飾器動態添加/覆蓋對象的現有方法中的行為。
外觀模式為大量代碼提供簡化的界面。
行為模式
策略模式允許在運行時即時選擇一個算法族中的一個。
模板方法將算法的骨架定義為抽象類,允許其子類提供具體行為。
迭代器依次訪問對象的元素而不暴露其基礎表示。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71347.html
摘要:代碼使用泛型類中不依賴于類型參數的方法。委托依賴于動態綁定,因為它要求給定的方法調用可以在運行時調用不同的代碼段。委托捕獲操作并將其發送給另一個對象。委托可以被看作是在對象層次上的復用機制,而繼承是類層次上的復用機制。 大綱 設計可復用的類 繼承和重寫 重載(Overloading) 參數多態和泛型編程 行為子類型與Liskov替換原則 組合與委托 設計可復用庫與框架 API和庫...
摘要:大綱什么是軟件復用如何衡量可復用性可復用組件的級別和形態源代碼級別復用模塊級別的復用類抽象類接口庫級別的復用包系統級別的復用框架對可復用性的外部觀察類型變化例行分組實施變更代表獨立分解常見行為總結什么是軟件復用軟件復用軟件復用是使用現有軟件 大綱 什么是軟件復用?如何衡量可復用性?可復用組件的級別和形態 源代碼級別復用 模塊級別的復用:類/抽象類/接口 庫級別的復用:API /包 系...
摘要:設計方案的容易改變這就是所謂的軟件構建的可維護性,可擴展性和靈活性。這也可能表明類型或方法可能難以維護。基于源代碼中不同運算符和操作數的數量的合成度量。對修改的封閉這種模塊的源代碼是不可侵犯的。 大綱 軟件維護和演變可維護性度量模塊化設計和模塊化原則OO設計原則:SOLIDOO設計原則:GRASP總結 軟件維護和演變 什么是軟件維護? 軟件工程中的軟件維護是交付后修改軟件產品以糾正故障...
摘要:抽象工廠模式將具有共同主題的對象工廠分組。對可重用性和可維護性設計模式的高層考慮創造性模式工廠方法模式也稱為虛擬構造器意圖定義一個用于創建對象的接口,但讓子類決定實例化哪個類。 大綱 創造性模式 工廠方法模式創建對象而不指定要創建的確切類。 抽象工廠模式將具有共同主題的對象工廠分組。 Builder模式通過分離構造和表示來構造復雜的對象。 結構模式 Bridge將抽象從其實現中分...
閱讀 2505·2023-04-25 19:31
閱讀 2239·2021-11-04 16:11
閱讀 2805·2021-10-08 10:05
閱讀 1515·2021-09-30 09:48
閱讀 2315·2019-08-30 15:56
閱讀 2406·2019-08-30 15:56
閱讀 2174·2019-08-30 15:53
閱讀 2268·2019-08-30 15:44