鍍金池/ 教程/ Java/ 處理多維度變化——橋接模式(一)
不兼容結(jié)構(gòu)的協(xié)調(diào)——適配器模式(三)
處理多維度變化——橋接模式(二)
擴展系統(tǒng)功能——裝飾模式(四)
<code>C#</code> 設(shè)計模式之代理模式(四)
擴展系統(tǒng)功能——裝飾模式(二)
實現(xiàn)對象的復(fù)用——享元模式(四)
實現(xiàn)對象的復(fù)用——享元模式(五)
處理多維度變化——橋接模式(三)
深入淺出外觀模式(二)
樹形結(jié)構(gòu)的處理——組合模式(二)
處理多維度變化——橋接模式(一)
<code>C#</code> 設(shè)計模式之代理模式(二)
不兼容結(jié)構(gòu)的協(xié)調(diào)——適配器模式(二)
深入淺出外觀模式(三)
實現(xiàn)對象的復(fù)用——享元模式(三)
不兼容結(jié)構(gòu)的協(xié)調(diào)——適配器模式(四)
樹形結(jié)構(gòu)的處理——組合模式(一)
擴展系統(tǒng)功能——裝飾模式(三)
深入淺出外觀模式(一)
處理多維度變化——橋接模式(四)
樹形結(jié)構(gòu)的處理——組合模式(五)
擴展系統(tǒng)功能——裝飾模式(一)
不兼容結(jié)構(gòu)的協(xié)調(diào)——適配器模式(一)
實現(xiàn)對象的復(fù)用——享元模式(二)
樹形結(jié)構(gòu)的處理——組合模式(三)
<code>C#</code> 設(shè)計模式之代理模式(一)
實現(xiàn)對象的復(fù)用——享元模式(一)
樹形結(jié)構(gòu)的處理——組合模式(四)
<code>C#</code> 設(shè)計模式之代理模式(三)

處理多維度變化——橋接模式(一)

在正式介紹橋接模式之前,我先跟大家談?wù)剝煞N常見文具的區(qū)別,它們是毛筆和蠟筆。假如我們需要大中小 3 種型號的畫筆,能夠繪制 12 種不同的顏色,如果使用蠟筆,需要準備 3×12 = 36 支,但如果使用毛筆的話,只需要提供 3 種型號的毛筆,外加 12 個顏料盒即可,涉及到的對象個數(shù)僅為 3 + 12 = 15,遠小于36,卻能實現(xiàn)與 36 支蠟筆同樣的功能。如果增加一種新型號的畫筆,并且也需要具有 12 種顏色,對應(yīng)的蠟筆需增加 12 支,而毛筆只需增加一支。為什么會這樣呢?通過分析我們可以得知:在蠟筆中,顏色和型號兩個不同的變化維度(即兩個不同的變化原因)融合在一起,無論是對顏色進行擴展還是對型號進行擴展都勢必會影響另一個維度;但在毛筆中,顏色和型號實現(xiàn)了分離,增加新的顏色或者型號對另一方都沒有任何影響。如果使用軟件工程中的術(shù)語,我們可以認為在蠟筆中顏色和型號之間存在較強的耦合性,而毛筆很好地將二者解耦,使用起來非常靈活,擴展也更為方便。在軟件開發(fā)中,我們也提供了一種設(shè)計模式來處理與畫筆類似的具有多變化維度的情況,即本章將要介紹的橋接模式。

跨平臺圖像瀏覽系統(tǒng)

Sunny 軟件公司欲開發(fā)一個跨平臺圖像瀏覽系統(tǒng),要求該系統(tǒng)能夠顯示 BMP、JPG、GIF、PNG 等多種格式的文件,并且能夠在 Windows、Linux、Unix 等多個操作系統(tǒng)上運行。系統(tǒng)首先將各種格式的文件解析為像素矩陣(Matrix),然后將像素矩陣顯示在屏幕上,在不同的操作系統(tǒng)中可以調(diào)用不同的繪制函數(shù)來繪制像素矩陣。系統(tǒng)需具有較好的擴展性以支持新的文件格式和操作系統(tǒng)。

Sunny 軟件公司的開發(fā)人員針對上述要求,提出了一個初始設(shè)計方案,其基本結(jié)構(gòu)如圖所示:

http://wiki.jikexueyuan.com/project/design-pattern-structurized/images/1334505400_2839.gif" alt="" />

在圖的初始設(shè)計方案中,使用了一種多層繼承結(jié)構(gòu),Image 是抽象父類,而每一種類型的圖像類,如 BMPImage、JPGImage 等作為其直接子類,不同的圖像文件格式具有不同的解析方法,可以得到不同的像素矩陣;由于每一種圖像又需要在不同的操作系統(tǒng)中顯示,不同的操作系統(tǒng)在屏幕上顯示像素矩陣有所差異,因此需要為不同的圖像類再提供一組在不同操作系統(tǒng)顯示的子類,如為 BMPImage 提供三個子類 BMPWindowsImp、BMPLinuxImp 和 BMPUnixImp,分別用于在 Windows、Linux 和 Unix 三個不同的操作系統(tǒng)下顯示圖像。

我們現(xiàn)在對該設(shè)計方案進行分析,發(fā)現(xiàn)存在如下兩個主要問題:

(1)由于采用了多層繼承結(jié)構(gòu),導(dǎo)致系統(tǒng)中類的個數(shù)急劇增加,圖中,在各種圖像的操作系統(tǒng)實現(xiàn)層提供了12個具體類,加上各級抽象層的類,系統(tǒng)中類的總個數(shù)達到了 17 個,在該設(shè)計方案中,具體層的類的個數(shù) = 所支持的圖像文件格式數(shù)×所支持的操作系統(tǒng)數(shù)。

(2)系統(tǒng)擴展麻煩,由于每一個具體類既包含圖像文件格式信息,又包含操作系統(tǒng)信息,因此無論是增加新的圖像文件格式還是增加新的操作系統(tǒng),都需要增加大量的具體類,例如在圖中增加一種新的圖像文件格式 TIF,則需要增加 3 個具體類來實現(xiàn)該格式圖像在3種不同操作系統(tǒng)的顯示;如果增加一個新的操作系統(tǒng) Mac OS,為了在該操作系統(tǒng)下能夠顯示各種類型的圖像,需要增加 4 個具體類。這將導(dǎo)致系統(tǒng)變得非常龐大,增加運行和維護開銷。

如何解決這兩個問題?我們通過分析可得知,該系統(tǒng)存在兩個獨立變化的維度:圖像文件格式和操作系統(tǒng),如圖所示:

http://wiki.jikexueyuan.com/project/design-pattern-structurized/images/1334505407_4083.gif" alt="" />

在圖中,如何將各種不同類型的圖像文件解析為像素矩陣與圖像文件格式本身相關(guān),而如何在屏幕上顯示像素矩陣則僅與操作系統(tǒng)相關(guān)。正因為圖所示結(jié)構(gòu)將這兩種職責集中在一個類中,導(dǎo)致系統(tǒng)擴展麻煩,從類的設(shè)計角度分析,具體類 BMPWindowsImp、BMPLinuxImp 和 BMPUnixImp 等違反了“單一職責原則”,因為不止一個引起它們變化的原因,它們將圖像文件解析和像素矩陣顯示這兩種完全不同的職責融合在一起,任意一個職責發(fā)生改變都需要修改它們,系統(tǒng)擴展困難。

如何改進?我們的方案是將圖像文件格式(對應(yīng)圖像格式的解析)與操作系統(tǒng)(對應(yīng)像素矩陣的顯示)兩個維度分離,使得它們可以獨立變化,增加新的圖像文件格式或者操作系統(tǒng)時都對另一個維度不造成任何影響??吹竭@里,大家可能會問,到底如何在軟件中實現(xiàn)將兩個維度分離呢?不用著急,本章我將為大家詳細介紹一種用于處理多維度變化的設(shè)計模式——橋接模式。