第9講:Composite 組合模式_第1頁(yè)
第9講:Composite 組合模式_第2頁(yè)
第9講:Composite 組合模式_第3頁(yè)
第9講:Composite 組合模式_第4頁(yè)
第9講:Composite 組合模式_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第9講:Composite 組合模式2006.2.17 李建忠對(duì)象容器的問(wèn)題在面向?qū)ο笙到y(tǒng)中,我們常會(huì)遇到一類具有“容器”特征的對(duì)象即它們?cè)诔洚?dāng)對(duì)象的同時(shí),又是其他對(duì)象的容器。如果我們要對(duì)這樣的對(duì)象容器進(jìn)行處理:上面是客戶代碼,客戶代碼里面必須要知道對(duì)象的結(jié)構(gòu),有可能還要使用遞歸的方法來(lái)處理這個(gè)對(duì)象,這樣寫耦合性就比較高??蛻舸a如果能只和IBox發(fā)生依賴就很好了,但是現(xiàn)在它還和ContainerBox和SingleBox發(fā)生了依賴,這樣內(nèi)部實(shí)現(xiàn)的細(xì)節(jié)就暴露給了外界,并且和外界產(chǎn)生了依賴關(guān)系。 動(dòng)機(jī)(Motivation)上述描述的問(wèn)題根源在于:客戶代碼過(guò)多地依賴于對(duì)象容器復(fù)雜的內(nèi)部

2、實(shí)現(xiàn)結(jié)構(gòu),對(duì)象容器內(nèi)部實(shí)現(xiàn)結(jié)構(gòu)(而非抽象接口)的變化將引起客戶代碼的頻繁變化,帶來(lái)了代碼的維護(hù)性、擴(kuò)展性等弊端。如何將“客戶代碼與復(fù)雜的對(duì)象容器結(jié)構(gòu)”解耦?讓對(duì)象容器自己來(lái)實(shí)現(xiàn)自身的復(fù)雜結(jié)構(gòu),從而使得客戶代碼就像處理簡(jiǎn)單對(duì)象一樣來(lái)處理復(fù)雜的對(duì)象容器? 意圖(Intent)將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。Composite使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。設(shè)計(jì)模式GoF 例說(shuō)Composite應(yīng)用以前面的例子為例改進(jìn)的方案期望的客戶代碼:接口和SingleBox代碼都不變ContainerBox代碼變化這樣做ContainerBox里面的Pro

3、cess方法就不用判斷是否是ContainerBox還是SingleBox,因?yàn)樗鼈儓?zhí)行的方法名字都叫做Process。而且客戶代碼也只用調(diào)用box的Process方法即可。但是這里還有一個(gè)問(wèn)題,客戶代碼訪問(wèn)不了ContainerBox的Add和Remove方法,因?yàn)镮Box接口里沒(méi)有定義。為了解決這個(gè)問(wèn)題,我們可以選擇在IBox接口里添加兩個(gè)方法Add和Remove,然后SingleBox的Add和Remove方法什么都不做或者拋出異常。但這樣的處理方法也和理想的方法有點(diǎn)差距,因?yàn)镮Box這個(gè)類并不符合我們類的單一職責(zé)原則,它有SingleBox和ContainerBox二者的職責(zé),因此Si

4、ngleBox對(duì)于Add和Remove也比較不好處理。但是總的來(lái)說(shuō),我們還是完成了客戶代碼的解耦工作。我們看看整個(gè)代碼的結(jié)構(gòu),ContainerBox里面包含了很多IBox,這些IBox有的是ContainerBox,有的也是SingleBox,因此它很像一個(gè)樹形的結(jié)構(gòu)。 結(jié)構(gòu)(Structure)Component抽象類或者接口對(duì)應(yīng)之前例子中的IBox,Leaf對(duì)應(yīng)SingleBox,Composite對(duì)應(yīng)ContainerBox??蛻舸a只依賴于Component抽象類或者結(jié)構(gòu),這正是我們期望的目的。 Composite模式的幾個(gè)要點(diǎn)Composite模式采用樹形結(jié)構(gòu)來(lái)

5、實(shí)現(xiàn)普遍存在的對(duì)象容器,從而將“一對(duì)多”的關(guān)系轉(zhuǎn)化為“一對(duì)一”的關(guān)系,使得客戶代碼可以一致地處理對(duì)象和對(duì)象容器,無(wú)需關(guān)心處理的是單個(gè)的對(duì)象,還是組合的對(duì)象容器。將“客戶代碼與復(fù)雜的對(duì)象容器結(jié)構(gòu)”解耦是Composite模式的核心思想,解耦之后,客戶代碼將與純粹的抽象接口而非對(duì)象容器的復(fù)雜內(nèi)部實(shí)現(xiàn)結(jié)構(gòu)發(fā)生依賴關(guān)系,從而更能“應(yīng)對(duì)變化”。Composite模式中,是將“Add和Remove等和對(duì)象容器相關(guān)的方法”定義在“表示抽象對(duì)象的Component類”中,還是將其定義在“表示對(duì)象容器的Composite類”中,是一個(gè)關(guān)乎“透明性”和“安全性”的兩難問(wèn)題,需要仔細(xì)權(quán)衡。這里有可能違背面向?qū)ο蟮摹?/p>

6、單一職責(zé)原則”,但是對(duì)于這種特殊結(jié)構(gòu),這又是必須付出的代價(jià)。ASP.Net控件的實(shí)現(xiàn)在這方面為我們提供了一個(gè)很好的示范。Composite模式在具體實(shí)現(xiàn)中,可以讓父對(duì)象中的子對(duì)象反向追朔;如果父對(duì)象有頻繁的遍歷需求,可使用緩存技巧來(lái)改善效率。 .NET框架中的Composite應(yīng)用ASP.Net中的Panel對(duì)象就是一個(gè)Composite對(duì)象,而Button對(duì)象就是Leaf對(duì)象。Button和Panel都繼承自System.Web.UI.Control類。它實(shí)際上是在Panel里面加了一個(gè)Controls屬性,然后Controls屬性是一個(gè)集合屬性,它有Add和Remove方法。這樣我們的IBox也可以改為:在ASP.Net中就是這樣,每一個(gè)控件都有Controls

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論