設計模式 學習筆記 之十二

2022-07-17 21:48:13 字數 2357 閱讀 9829

adapter模式是一種簡單的模式。當我們需要使用乙個現成的類,但它的介面又跟要求的介面有出入時,我們就使用adapter模式把這個現成的類適配到目標介面。我們下面來看乙個具體的例子。

假設我們在開發乙個2維圖形程式。在這個程式中,需要乃至若干形狀類,如點、直線和矩形。為了給這些開關類建模,我們設計了乙個shape介面,如下所示。

現在新的需求來了。我們希望加入對圓形的支援,這就是說,我們要在shape class hierarchy中加入circle類並實現它。不過幸運的是,公司中已經有另外的同事開發出了乙個名為xxcircle的類,它能夠處理圓形的相關操作。但是,它的方法的命名跟shape介面所要求的有點出入。

為了能使用這個現成的類,但同時又滿足shape介面,我們需要使xxcircle類適配到shape介面,我們為此引入乙個介面卡類,就像下面這樣。

這就是adapter模式。adapter模式讓我們不必擔心介面的匹配問題。如果有乙個現成的類,它滿足我們的需要但介面不正確,我們總是使用adapter模式讓它適配到正確的介面。

在本章中我們要學習bridge模式。我們關注的重點是如何從問題域推導出bridge模式。正如之前我們反覆強調的,使用共性變性分析,我們可以獲得優良的設計。bridge模式也是應該共性變性分析的乙個佐證。我們通過乙個例子來學習。

我們繼續開發前一章提到的2維圖形程式。假設目前我們得到了如下圖所示的設計:

現在又來了乙個新的需求。原先的系統是使用v1版本的驅動程式,現在驅動程式**商開發出了v2版本的驅動程式,因此我們的2維圖形程式需要同時支援這兩個版本的驅動程式。

怎麼解決這個問題?乙個比較容易想到的辦法是:從point,line等類中繼續派生出子類,讓子類使用不同的驅動程式。這樣得到的設計如下圖所示。

這是個優良的設計嗎?至少從直覺上看不是,因為這個class hierarchy中的類似乎有點多。我們不妨假設一下,如果在shape中再引入乙個新的圖形,如正方形,那麼就會要求引入3個子類:square,v1square和v2square。另一方面,如果以後要求同時支援v1、v2和v3版本的驅動程式,那麼已有的全部圖形類都要再擴充套件出乙個v3shape類來。類**的問題已經顯現了!

這個低劣設計的根源在**?我們來看一下,在已有的shape class hierarchy中,共性是形狀類,變性是不同的形狀。現在,為了應對新的需求變化,設計者在已有的shape class hierarchy中疊加上另乙個共性變性分析,這一次共性是使用驅動程式,變性是使用的驅動程式的版本不同。在乙個class hierarchy中利用繼承關係疊加上兩個不相關的共性變性分析是非常錯誤的,它的結果往往就是引起類**!

那麼怎麼解決?其實上,我們已經分析出了問題的關鍵:把兩個共性變性分析使用繼承關係疊加到同乙個class hierarchy中。因此,解決它的辦法就是,把兩個共性變性分析封裝到兩個class hierarchy中,然後使用委派關係(而非繼承關係)把這兩個共性變性分析關聯起來,就像下面這樣。

這樣得到的新設計比前面的設計「清爽」多了。讓shape class hierarchy與driver class hierarchy隔離開來,使得它們不再雜糅在同乙個class hierarchy中,這樣shape和driver都可以靈活地變化了。當然,由於它們之間存在委派關係,因此不可能完全互不影響,但是,比起繼承那樣的強耦合關係,使用委派使得shape和driver相互之間的影響大大降低了。

這個新的設計體現的正是bridge模式。bridge模式的要義就是使用「委派關係」讓兩個class hierarchy鬆散耦合,使得它們彼此之間的影響最小化。

實際上,對驅動程式的依賴都是bridge模式的體現。在開發驅動程式時,一般都會設計出乙個抽象驅動程式層(adi),而不同的驅動程式都實現這個adi。應用程式則通過委派關係來使用驅動程式,這樣應用程式與驅動程式程式是鬆散耦合的,應用程式和驅動程式可以獨立開發,彼此在多數情況下不會互相影響。

設計模式學習之十二 模板方法模式

製作豆漿的流程,選材 新增配料 浸泡 豆漿機中打碎 通過不同的配料。可以製作不同口味的豆漿 選材。浸泡,和打碎這幾個步驟對於製作每種口味的豆漿都是一樣的 通過模板方法模式完成 模板方法模式 template method pattern 又叫模板模式。在乙個抽象類公開定義執行它的方法的模板。它的子類...

設計模式學習筆記(十二) Flyweight享元

十一 flyweight 享元 情景舉例 運用共享技術有效地支援大量細粒度的物件。示例 flyweight 抽象類。其操作中的glyphcontext下文會介紹 class glyph flyweight 具體類。class character public glyph glyphcontext 是...

設計模式之十二模板模式

模式介紹 1 模板方法模式 template method pattern 又叫模板模式 template pattern z 在乙個抽象類公開定義了執行它的方法的模板。它的子類可以按需要重寫方法 實現,但呼叫將以抽象類中定義的方式進行。2 簡單說,模板方法模式 定義乙個操作中的演算法的骨架,而將一...