設計模式與封裝變化
設計模式可以確定系統能以特定方式變化 ( 這很大程度是一種預測 ) ,進而幫助設計者避免重新設計系統。每一個設計模式允許系統結構的某個部分的變化獨立于其他部分,這樣産生的系統對于某一種特殊變化将更健壯。
下面闡述一些導緻重新設計的一般原因,以及解決這些問題的常用設計模式:
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 | 作用于對象上的操作 |
待續......