概述
結(jié)構(gòu)型模式主要用于描述如何組合<i>類</i><i>和</i>對象以獲得更大的結(jié)構(gòu)。其中,結(jié)構(gòu)型類模式采用繼承機制來組合接口和實現(xiàn);而結(jié)構(gòu)型對象模式則采用組合/聚合方式來組合對象以實現(xiàn)新功能,因為它可以在運行時刻改變對象組合關(guān)系,所以對象組合方式具有更大的靈活性,這種機制是無法通過靜態(tài)類組合來實現(xiàn)的。
在各種結(jié)構(gòu)型模式的實現(xiàn)上基本上遵循優(yōu)先使用對象組合,而不是類繼承原則
常用的結(jié)構(gòu)型模式
常用的結(jié)構(gòu)型模式總共有七種,簡寫為:ABCDFFP(Adapter,Bridge,
Decorator,Fa?ade,Flyweight,Proxy),也就是對應的的適配器模式、橋接模式、組合模式、裝飾模式、外觀模式、享元模式和代理模式。
模式區(qū)別比較
<i>首先大致瀏覽下所有結(jié)構(gòu)型模式的主要作用</i>:
1.適配器模式:將一個類的接口轉(zhuǎn)換成客戶希望的另外一種接口,這樣就能實現(xiàn)已有接口的復用。適配器主要有類適配器和對象適配器兩種實現(xiàn)方式,通常情況下,推薦優(yōu)先使用對象適配器方式。
2.橋接模式:將抽象部分與實現(xiàn)部分分離,使它們都可以獨立地變化。它主要用于應對多維度變化點問題,通過對象組合的方式,可以極大地減少子類的數(shù)目,同時還能讓不同維度獨立擴展變化。
3.組合模式:將對象組合成樹形結(jié)構(gòu)以表示“整合-部分”的層次結(jié)構(gòu),從而使得用戶對單個對象和組合對象的使用具有一致性,也就是客戶端能夠透明地無區(qū)別地操作兩者。
4.裝飾模式:動態(tài)地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式相比生成子類更為靈活。假若使用多繼承的方式來完成職責的添加,將會不可避免地造成子類數(shù)目的“爆炸性”增長,此外,因為是靜態(tài)增加的,那也就不可能在運行狀態(tài)時動態(tài)地添加或者刪除額外職責呢。
5.外觀模式:為子系統(tǒng)中的一組接口提供一個一致的接口,外觀模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。這樣原來需要客戶直接與復雜的子系統(tǒng)打交道、交互,現(xiàn)在這一過程將完全將交由外觀對象來完成,極大地方便了客戶端的調(diào)用。
6.享元模式:運用共享技術(shù)有效地支持大量細粒度的對象。享元模式關(guān)鍵是將對象的內(nèi)部狀態(tài)和外部狀態(tài)分離,盡可能地對“穩(wěn)定”的內(nèi)部狀態(tài)進行共享,而將會隨運用場景而改變的狀態(tài)通過外部狀態(tài)傳入。
7.代理模式:為其他對象提供一種代理以控制對這個對象的訪問。主要是在客戶端和目標對象間增加一層間接層,通過這個間接層來完成對目標對象的種種控制操作,所以也就形成了不同功能類型的代理呢,比如遠程代理、保護代理和虛代理等等。
<i>完成了對所有結(jié)構(gòu)型模式的意圖介紹,現(xiàn)在我們通過對比的方式來進一步加深對各個結(jié)構(gòu)型模式的認識,同時也能進一步理解結(jié)構(gòu)型模式間的關(guān)聯(lián)和區(qū)別點</i>:
1.裝飾模式與橋接模式:兩者從某種意思上來說都是通過對象組合的的方式來避免功能子類數(shù)目的急劇增長,但是兩者解決之道卻各有特點:
- 裝飾模式是將子類中較基類中多出來的功能部分放到單獨的類中,以滿足對基類新功能添加的需要,將不同的功能(職責)封裝成一個個獨立地裝飾類,這樣當各種不同的功能類組合到基類中時,就可以較好地完成基類對新功能的要求,也就相當于是一個增加的功能子類呢。
- 橋接模式是通過將基類的實現(xiàn)化部分抽象出來,形成一個獨立的實現(xiàn)結(jié)構(gòu),同時也將基類部分構(gòu)建成一個抽象化的等級結(jié)構(gòu)。如此,抽象化部分和實現(xiàn)化部分就可以在各自的維度上獨立地發(fā)生變化和擴展,通過橋接的方式將兩者關(guān)聯(lián),簡單地說就是抽象化部分保留一個實現(xiàn)化部分的引用,在需要的時候方便調(diào)用。下面是裝飾模式與橋接模式的簡單結(jié)構(gòu)對比圖:

2.外觀模式與代理模式:兩者解決的問題側(cè)重點不一樣,但是解決問題的思路是一致的,都是通過引進一層間接層,這樣的解決方式在軟件開發(fā)時經(jīng)常使用到。
- 外觀模式主要用于簡化接口,但是外觀也完全可以同代理模式結(jié)合使用,因為外觀對象完全可以是一個位于遠程地址空間對象的遠程代理,簡稱為外觀代理模式或者說是代理外觀模式,下面是外觀模式和代理模式的簡單結(jié)構(gòu)對比圖:


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

參考資料
http://www.cnblogs.com/JackyTecblog/archive/2012/11/02/2751954.html