結構模式總結--好文章

結構型模式主要用於描述如何組合類和對象以獲得更大的結構。其中,結構型類模式採用繼承機制來組合接口和實現,而結構型對象模式則採用組合/聚合方式來組合對象以實現新功能,因爲它可以在運行時刻改變對象組合關係,所以對象組合方式具有更大的靈活性,這種機制是無法通過靜態類組合來實現的。當然兩者都有彼此擅長之處,具體的取捨需要根據實際的應用場景而定。我們介紹過的結構型模式總共有七種,簡寫爲:ABCDFFP(Adapter,Bridge,Composite,Decorator,Fa?ade,Flyweight,Proxy),也就是對應的的適配器模式、橋接模式、組合模式、裝飾模式、外觀模式、享元模式和代理模式。從之前對以上七種結構型模式的介紹裏,我們瞭解到優先使用對象組合,而不是類繼承原則在結構型模式中得到淋漓盡致的體現,當然並不是說不能使用繼承方式,畢竟類繼承可是面向對象的三大特性之一(多態、繼承和封裝)。應該說繼承是隨便可見的,但是每一種繼承只適合於封裝一種變化,面對多維變化場景時,如果仍強行使用多繼承方式來實現,必然會造成子類數目成“爆炸性”增長問題,這方面敘述在橋接模式和裝飾器模式中都有很好的體現。比如在橋接模式中,通過簡單的繼承方式並不能很好地處理抽象化與實現化都獨立變化的情況,但是通過對象組合的方式卻可以很好地應對這方面需求,使多維變化點能夠獨立地擴展和變化。

模式區別比較

首先讓我們先大致瀏覽下所有結構型模式的主要作用吧!

  1. 適配器模式:將一個類的接口轉換成客戶希望的另外一種接口,這樣就能實現已有接口的複用。適配器主要有類適配器和對象適配器兩種實現方式,通常情況下,推薦優先使用對象適配器方式。
  2. 橋接模式:將抽象部分與實現部分分離,使它們都可以獨立地變化。它主要用於應對多維度變化點問題,通過對象組合的方式,可以極大地減少子類的數目,同時還能讓不同維度獨立擴展變化。
  3. 組合模式:將對象組合成樹形結構以表示“整合-部分”的層次結構,從而使得用戶對單個對象和組合對象的使用具有一致性,也就是客戶端能夠透明地無區別地操作兩者。
  4. 裝飾模式:動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式相比生成子類更爲靈活。假若使用多繼承的方式來完成職責的添加,將會不可避免地造成子類數目的“爆炸性”增長,此外,因爲是靜態增加的,那也就不可能在運行狀態時動態地添加或者刪除額外職責呢。
  5. 外觀模式:爲子系統中的一組接口提供一個一致的接口,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。這樣原來需要客戶直接與複雜的子系統打交道、交互,現在這一過程將完全將交由外觀對象來完成,極大地方便了客戶端的調用。
  6. 享元模式:運用共享技術有效地支持大量細粒度的對象。享元模式關鍵是將對象的內部狀態和外部狀態分離,儘可能地對“穩定”的內部狀態進行共享,而將會隨運用場景而改變的狀態通過外部狀態傳入。
  7. 代理模式:爲其他對象提供一種代理以控制對這個對象的訪問。主要是在客戶端和目標對象間增加一層間接層,通過這個間接層來完成對目標對象的種種控制操作,所以也就形成了不同功能類型的代理呢,比如遠程代理、保護代理和虛代理等等。

完成了對所有結構型模式的意圖介紹,現在我們通過對比的方式來進一步加深對各個結構型模式的認識,同時也能進一步理解結構型模式間的關聯和區別點。

  • 裝飾模式與橋接模式:兩者從某種意思上來說都是通過對象組合的的方式來避免功能子類數目的急劇增長,但是兩者解決之道卻各有特點。裝飾模式是將子類中較基類中多出來的功能部分放到單獨的類中,以滿足對基類新功能添加的需要,將不同的功能(職責)封裝成一個個獨立地裝飾類,這樣當各種不同的功能類組合到基類中時,就可以較好地完成基類對新功能的要求,也就相當於是一個增加的功能子類呢。而橋接模式是通過將基類的實現化部分抽象出來,形成一個獨立的實現結構,同時也將基類部分構建成一個抽象化的等級結構。如此,抽象化部分和實現化部分就可以在各自的維度上獨立地發生變化和擴展,通過橋接的方式將兩者關聯,簡單地說就是抽象化部分保留一個實現化部分的引用,在需要的時候方便調用。下面是裝飾模式與橋接模式的簡單結構對比圖:

image

  • 外觀模式與代理模式:兩者解決的問題側重點不一樣,但是解決問題的思路是一致的,都是通過引進一層間接層,這樣的解決方式在軟件開發時經常使用到。外觀模式主要用於簡化接口,但是外觀也完全可以同代理模式結合使用,因爲外觀對象完全可以是一個位於遠程地址空間對象的遠程代理,簡稱爲外觀代理模式或者說是代理外觀模式,下面是外觀模式和代理模式的簡單結構對比圖:

image image

  • 適配器模式:其主要是目的是轉換接口,完成類庫複用或者代碼遷移等工作,是一種“事後解決之道”——亡羊補牢。主要有兩種適配器模式,類適配器和對象適配器,需要根據實際的應用環境來選用兩者其中之一。但一般情況下建議優先使用對象適配器,這樣可以避免多繼承方式的各種弊端,下面是兩種類型的適配器模式簡略圖:

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章