天天看點

設計模式學習筆記(四):封裝變化

設計模式與封裝變化

設計模式可以確定系統能以特定方式變化 ( 這很大程度是一種預測 ) ,進而幫助設計者避免重新設計系統。每一個設計模式允許系統結構的某個部分的變化獨立于其他部分,這樣産生的系統對于某一種特殊變化将更健壯。

下面闡述一些導緻重新設計的一般原因,以及解決這些問題的常用設計模式:

1) 通過顯式地指定一個類來建立對象。 在建立對象時指定類名 将使設計者受特定實作的限制 , 而不是特定接口 的限制。這會使未來的變化更複雜。要避免這種情況,應該間接地建立對象 。

設計模式: Abstract Factory , Factory Method , Prototype 。

2) 對特殊操作的依賴。 當設計者為請求指定一個特殊操作 時,完成該請求的方式就固定了。避免把請求代碼寫死,可在編譯時刻或運作時刻友善地改變響應請求的方法。

設計模式: Chain of Responsibility (5.1) , Command ( 5 . 2 ) 。

3) 對硬體和軟體平台的依賴。 外部的作業系統接口和應用程式設計接口 (API) 在不同的軟硬體平台上是不同的。依賴于特定平台的軟體将很難移植到其他平台上,甚至都很難跟上本地平台的更新。是以設計系統時限制其平台相關性 就很重要了。

設計模式: Abstract Factory(3.1) , Bridge ( 4 . 2 ) 。

4) 對對象表示或實作的依賴。 知道對象怎樣表示、儲存、定位或實作的客戶在對象發生變化時可能也需要變化。對客戶隐藏這些資訊能阻止連鎖變化。

設計模式: Abstract Factory(3.1) , Bridge ( 4 . 2 ) , Memento ( 5 . 6 ) , Proxy ( 4 . 7 )

5) 算法依賴。 算法在開發和複用時常常被擴充、優化和替代。依賴于某個特定算法的對象在算法發生變化時不得不變化。是以有可能發生變化的算法 應該被孤立起來。

設計模式: Builder ( 3 . 2 ) , Iterator ( 5 . 4 ) , Strategy ( 5 . 9 ) , Template Method(5.10) ,

Visitor ( 5 . 11 )

6) 緊耦合的類 很難獨立地被複用,因為它們是互相依賴的。緊耦合産生單塊的系統,要改變或删掉一個類,必須了解和改變其他類。這樣的系統是一個很難學習、移植和維護的密集體。

松散耦合 提高了一個類本身被複用的可能性,并且系統更易于學習、移植、修改和擴充。

設計模式使用抽象耦合 和分層技術 來提高系統的松散耦合性。

設計模式: Abstract Factory(3.1) , Command ( 5 . 2 ) , Facade ( 4 . 5 ) , Mediator ( 5 . 5 ) ,

Observer(5.7) , Chain of Responsibility(5.1) 。

7) 通過生成子類來擴充功能。 通常很難通過定義子類來定制對象。每一個新類都有固定的實作開銷 ( 初始化、終止處理等 ) 。定義子類還需要對父類有深入的了解。如,重定義一個操作可能需要重定義其他操作。一個被重定義的操作可能需要調用繼承下來的操作。并且子類方法會導緻類爆炸,因為即使對于一個簡單的擴充,也不得不引入許多新的子類。 ( 本質 : 繼承應該僅僅封裝一個變化點 )

一般的對象組合技術 和具體的委托技術 ,是繼承 之外組合對象行為的另一種靈活方法 。新的功能可以通過以新的方式組合已有對象 ,而不是通過定義已存在類的子類的方式加到應用中去。另一方面,過多使用對象組合會使設計難于了解。許多設計模式産生的設計中,設計者可定義一個子類,且将它的執行個體和已存在執行個體進行組合來引入定制的功能。

設計模式: Bridge ( 4 . 2 ) , Chain of Responsibility(5.1) , Composite ( 4 . 3 ) , Decorator ( 4 . 4 ) , Observer (5.7) , Strategy ( 5 . 9 ) 。

8) 不能友善地對類進行修改。 有時設計者不得不改變一個難以修改的類。也許你需要源代碼而又沒有 ( 對于商業類庫 就有這種情況 ) ,或者可能對類的任何改變會要求修改許多 已存在的其他子類。設計模式提供在這些情況下對類進行修改的方法。

設計模式: Adapter ( 4 . 1 ) , Decorator ( 4 . 4 ) , Visitor ( 5 . 11 ) 。

設計模式與其封裝的變化點

設計模式 變化點
建立型 Abstract Factory 産品對象家族
Builder 組合建立組合 ( 複雜 ) 對象
Factory Method 被執行個體化的子類 ( 相關類 )
Prototype 被執行個體化的類
Singleton 一個類的唯一執行個體
Object Factory 被執行個體化的類, Factory Method 的變種
Object Pool 對象管理和重用, Factory Method 的變種
Creation Method 類的構造函數, Factory Method 的變種
結構型 Adapter 對象的接口 ( 可變 API)
Bridge 對象實作 ( 實作邏輯 )
Composite 對象的結構群組成
Decorator 對象的職責 ( 職責組合 )
Façade 子系統的接口 ( 子系統的變化 )
Flyweight 對象的存儲
Proxy 對象的通路和對象的位置
行為型 Chain of Responsibility 滿足某個請求的對象 ( 請求的實際處理對象 )
Command 何時、如何實作某個請求
Interpreter 一個語言的文法和解釋
Iterator 如何周遊、通路一個聚合的各元素
Mediator 對象間的互動邏輯
Memento 對象資訊的存儲管理
Observer 對象間的依賴和通訊
State 對象狀态
Strategy 算法
Template Method 算法某些步驟
Visitor 作用于對象上的操作

待續......

繼續閱讀