設(shè)計(jì)模式總結(jié)-組合模式_第1頁
設(shè)計(jì)模式總結(jié)-組合模式_第2頁
設(shè)計(jì)模式總結(jié)-組合模式_第3頁
設(shè)計(jì)模式總結(jié)-組合模式_第4頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、- 精品 word 文檔 值得下載 值得擁有 -注:文檔內(nèi)容基本上來自于網(wǎng)上,并加上自己的理解而成。有的覺得網(wǎng)友總結(jié)得非常好,就完全照搬下來,供學(xué)習(xí)之用。然而,有的摘抄并沒有加上原鏈接和出處,請(qǐng)諒解。要點(diǎn):1. 用于處理樹形結(jié)構(gòu)的問題中,它模糊了簡(jiǎn)單元素和復(fù)雜元素的概念,客戶程序可以像處理簡(jiǎn)單元素一樣來處理復(fù)雜元素,從而使得客戶程序與復(fù)雜元素內(nèi)部結(jié)構(gòu)解耦。2. 組合模式可以優(yōu)化處理遞歸或者分級(jí)數(shù)據(jù)結(jié)構(gòu)。我們可以將組合理解為兩個(gè)層面的意思,一個(gè)是按“整體-部分”的方式一個(gè)將復(fù)雜過程組成樹型結(jié)構(gòu),另一個(gè)層面則是強(qiáng)調(diào)整個(gè)樹的執(zhí)行要有統(tǒng)一的接口,可以被遞歸的調(diào)用。3. 應(yīng)用場(chǎng)景: OS 文件系統(tǒng), J

2、Unit1. (Composite Pattern)組合模式詳解 1:組合模式 (Composite Pattern) 有時(shí)候又叫做部分 -整體模式,它使我們樹型結(jié)構(gòu)的問題中,模糊了簡(jiǎn)單元素和復(fù)雜元素的概念,客戶程序可以像處理簡(jiǎn)單元素一樣來處理復(fù)雜元素 ,從而使得客戶程序與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。組合模式讓你可以優(yōu)化處理遞歸或分級(jí)數(shù)據(jù)結(jié)構(gòu)。有許多關(guān)于分級(jí)數(shù)據(jù)結(jié)構(gòu)的例子,使得組合模式非常有用武之地。關(guān)于分級(jí)數(shù)據(jù)結(jié)構(gòu)的一個(gè)普遍性的例子是你每次使用電腦時(shí)所遇到的:文件系統(tǒng)。文件系統(tǒng)由目錄和文件組成。每個(gè)目錄都可以裝內(nèi)容。目錄的內(nèi)容可以是文件,也可以是目錄。按照這種方式,計(jì)算機(jī)的文件系統(tǒng)就是以遞歸結(jié)構(gòu)

3、來組織的。如果你想要描述這樣的數(shù)據(jù)結(jié)構(gòu),- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -那么你可以使用組合模式Composite 。定義 (GoF 設(shè)計(jì)模式 ):將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分整體”的層次結(jié)構(gòu)。組合模式使得用戶對(duì)單個(gè)對(duì)象和使用具有一致性。涉及角色:1.Component是組合中的對(duì)象聲明接口,在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的默認(rèn)行為 。聲明一個(gè)接口用于訪問和管理Component子部件。2.Leaf在組合中表示葉子結(jié)點(diǎn)對(duì)象,葉子結(jié)點(diǎn)沒有子結(jié)點(diǎn)。3.Composite定義有枝節(jié)點(diǎn)行為,用來存儲(chǔ)子部件,在Component接口中實(shí)

4、現(xiàn)與子部件有關(guān)操作,如增加(add) 和刪除 (remove)等。適用性以下情況下適用Composite模式:1你想表示對(duì)象的部分-整體層次結(jié)構(gòu)2你希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象??偨Y(jié)組合模式解耦了客戶程序與復(fù)雜元素內(nèi)部結(jié)構(gòu),從而使客戶程序可以向處理簡(jiǎn)單元素一樣來處理復(fù)雜元素。如果你想要?jiǎng)?chuàng)建層次結(jié)構(gòu),并可以在其中以相同的方式對(duì)待所有元素,那么組合模式就是最理想的選擇。本章使用了一個(gè)文件系統(tǒng)的例子來舉例說明了組合模式的用途。在這個(gè)例子中,文件和目錄都執(zhí)行相同的接口,這是組合模式的關(guān)鍵。通過執(zhí)行相同的接口,你就可以用相同的方式對(duì)待文件和目錄,從而實(shí)現(xiàn)將文

5、件或者目錄儲(chǔ)存為目錄的子級(jí)元素。- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -如圖 :舉例如下:java1. package posite;2. /*3. * 文件名稱:4. * 創(chuàng)建人: Fei Wong5. * 創(chuàng)建時(shí)間: 2012-06-266. * 電子郵箱:7. *8. */9. public abstract class Company 10. private String name;11.12. public Company(String name) 13. = name;14. 15.16. public Co

6、mpany() 17. 18.19. public String getName() 20. return name;21. 22.23. public void setName(String name) 24. = name;25. 26.27. protected abstract void add(Company company);28.29. protected abstract void romove(Company company);30.31. protected abstract void display(int depth);- 精品 word 文檔 值得

7、下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -32. 6.37. package designcomposite.;1. /*42. * 文件名稱:43. * 創(chuàng)建人: Fei Wong44. * 創(chuàng)建時(shí)間: 2012-06-2645. * 電子郵箱:46. *47. */48. public class ConcreteCompany extends Company 49. private List cList;50.51. public ConcreteCompany() 52. cList = new ArrayList();53

8、. 54.55. public ConcreteCompany(String name) 56. super(name);57. cList = new ArrayList() ;58. 59.60. Override61. protected void add(Company company) 62. cList.add(company);63. 64.65. Override66. protected void display(int depth) 67. / TODO Auto-generated method stub68. StringBuilder sb = new StringB

9、uilder();69. for (int i = 0; i depth; i+) 70. sb.append(-);71. 72.73. for (Company c : cList) 74. c.display(depth + 2); /注意:其實(shí)這里是一個(gè)遞歸調(diào)用75. 76. 77.78. Override79. protected void romove(Company company) 80. cList.remove(company);81. 82. 83.84.- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -85.86. packa

10、ge posite;87. /*88. * 文件名稱:89. * 創(chuàng)建人: Fei Wong90. * 創(chuàng)建時(shí)間: 2012-06-2691. * 電子郵箱:92. */93. public class FinanceDepartment extends Company 94.95.96. public FinanceDepartment()97.98. 99.100. public FinanceDepartment(String name)101. super(name);102. 103.104. Override105. protected void add(Company compa

11、ny) 106.107. 108.109. Override110. protected void display(int depth) 111. StringBuilder sb = new StringBuilder();112. for (int i = 0; i depth; i+) 113. sb.append(-);114. 115.116. 117.118. Override119. protected void romove(Company company) 120.121. 122.123. 27.128. package posite;129. /

12、*130. * 文件名稱:131. * 創(chuàng)建人: Fei Wong132. * 創(chuàng)建時(shí)間: 2012-06-26133. * 電子郵箱:134. */135. public class HRDepartment extends Company 136.137.- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -138. public HRDepartment()139.140. 141.142. public HRDepartment(String name)143. super(name);144. 145.146. Override147. pro

13、tected void add(Company company) 148.149. 150.151. Override152. protected void display(int depth) 153. StringBuilder sb = new StringBuilder();154. for (int i = 0; i depth; i+) 155. sb.append(-);156. 157.158. 159.160. Override161. protected void romove(Company company) 162.163. 164.165.

14、69.170. package posite;171.172. public class Client 173.174. /*175. * param args176. */177. public static void main(String args) 178. / TODO Auto-generated method stub179. Company root = new ConcreteCompany();180. root.setName(北京總公司 );181. root.add(new HRDepartment(總公司人力資源部 );182. root.add(new Finan

15、ceDepartment(總公司財(cái)務(wù)部 );183. Company shandongCom = new ConcreteCompany(山東分公司 );184.shandongCom.add(new HRDepartment(山東分公司人力資源部 );185.shandongCom.add(new FinanceDepartment(山東分公司賬務(wù)部 );186. Company zaozhuangCom = new ConcreteCompany(棗莊辦事處 );187.zaozhuangCom.add(new FinanceDepartment(棗莊辦事處財(cái)務(wù)部 );188.zaozhu

16、angCom.add(new HRDepartment(棗莊辦事處人力資源部 );189. Company jinanCom = new ConcreteCompany(濟(jì)南辦事處 );- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -190.jinanCom.add(new FinanceDepartment(濟(jì)南辦事處財(cái)務(wù)部 );191.jinanCom.add(new HRDepartment(濟(jì)南辦事處人力資源部 );192. shandongCom.add(jinanCom);193. shandongCom.add(zaozhuangCo

17、m);194. Company huadongCom = new ConcreteCompany(上海華東分公司 );195.huadongCom.add(new HRDepartment(上海華東分公司人力資源部 );196.huadongCom.add(new FinanceDepartment(上海華東分公司賬務(wù)部 );197. Company hangzhouCom = new ConcreteCompany(杭州辦事處 );198. hangzhouCom.add(new FinanceDepartment(杭州辦事處財(cái)務(wù)部 );199. hangzhouCom.add(new HR

18、Department(杭州辦事處人力資源部 );200. Company nanjingCom = new ConcreteCompany(南京辦事處 );201.nanjingCom.add(new FinanceDepartment(南京辦事處財(cái)務(wù)部 );202.nanjingCom.add(new HRDepartment(南京辦事處人力資源部 );203. huadongCom.add(hangzhouCom);204. huadongCom.add(nanjingCom);205. root.add(shandongCom);206. root.add(huadongCom);207

19、. root.display(0);208. 209.210. 詳解 2:組合模式意在組成任意復(fù)雜度的 整體 - 部分 組件層次結(jié)構(gòu),同時(shí)將單個(gè)組件或復(fù)合組件視為統(tǒng)一的接口。我們可以將組合理解為兩個(gè)層面的意思,一個(gè)是按“整體-部分”的方式一個(gè)將復(fù)雜過程組成樹型結(jié)構(gòu),另一個(gè)層面則是強(qiáng)調(diào)整個(gè)樹的執(zhí)行要有統(tǒng)一的接口,可以被遞歸的調(diào)用。光看定義的話一定感覺太抽象了,網(wǎng)上的文章都是抄來抄去那幾篇,內(nèi)容很生硬,我來舉個(gè)通俗點(diǎn)的例子解釋一下大家就明白了。(本文系作者原創(chuàng),請(qǐng)尊重作者的權(quán)利。本文歡迎轉(zhuǎn)載,如轉(zhuǎn)載必須注明作者及出處!)想了解更多JAVA 設(shè)計(jì)模式嗎?請(qǐng)閱讀博主系列原創(chuàng)作品:我眼中的JAVA 設(shè)計(jì)

20、模式就拿網(wǎng)上常見的畫圖的例子來說吧,畫圖是一個(gè)由簡(jiǎn)到難、由局部到整體的過程,假設(shè)我們畫下面的一個(gè)圖:- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -用程序來實(shí)現(xiàn),我們可能會(huì)用最原始也是最直觀的方法。public class Picture void drawShape1()/ 畫形狀 1void drawShape2()/ 畫形狀 2void drawShape3()/ 畫形狀 3void drawPicture()drawShape1();drawShape2();drawShape3();上面的代碼很直觀,但問題也很明顯,這樣的代碼是沒有任何重

21、用性可言的,換了另一副畫,哪怕還是這幾個(gè)圖形,只是彼此相對(duì)位置稍微改動(dòng)一下就得重新設(shè)計(jì)代碼,所以我相信這樣的代碼大部分開發(fā)者是不會(huì)接受的?;谏厦娴睦碛晌覀儊碇匦略O(shè)計(jì)代碼,將畫圖過程中可重用的部分抽象出來。class Rectangle/ 輸入四個(gè)角的坐標(biāo)- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -Rectangle(Point a,Point b,Point c,Point d)void drawRectangle()/ 在這里畫矩形class Triangle/ 輸入三個(gè)頂點(diǎn)的坐標(biāo)Rectangle(Point a,Point b,Poin

22、t c)void drawTriangle()/ 在這里畫三角型class Picture Rectangle r1 = new Rectangle();Rectangle r2 = new Rectangle();Triangle t1 = new Triangle();void drawPicture()r1.drawRectangle();r2.drawRectangle();t1.drawTriangle();在這里我們已經(jīng)引入了組合的第一層含義,即將復(fù)雜的過程進(jìn)行分解,然后按“整體- 部分”的方式組合成樹型結(jié)構(gòu)。在這里, Picture是整體, Rectangle和 Triangle

23、是部分。- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -上面的代碼看起來比最初的代碼要好很多了,我們實(shí)現(xiàn)了可重用部分的抽象。但仔細(xì)思考我們會(huì)發(fā)現(xiàn)上面的代碼還是不夠完美,如果圖形非常復(fù)雜,整個(gè)結(jié)構(gòu)的“樹根”部分就會(huì)變得非常臃腫,在這里我們指的是drawPicture方法,想象一下一個(gè)圖片由上百個(gè)圖形組成。為了避免這樣的情況出現(xiàn),我們將畫不同的Shape ( Picture當(dāng)然也可以看成是一個(gè)Shape )的方法名稱統(tǒng)一起來,抽象出一個(gè)統(tǒng)一的接口,這樣我們可以用一個(gè)類似于遞歸的方式來處理整個(gè)過程,看下面的代碼:public interface Shap

24、e/ 畫形狀void draw();class Rectangle implements Shape/ 輸入四個(gè)角的坐標(biāo)Rectangle(Point a,Point b,Point c,Point d)Overridevoid draw()/ 在這里畫矩形class Triangle implements Shape/ 輸入三個(gè)頂點(diǎn)的坐標(biāo)Rectangle(Point a,Point b,Point )Overridevoid draw()/ 在這里畫三角型- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -/ 這是一個(gè)復(fù)雜的 Shape ,由若干個(gè)其它 Shpae 組成class ComplexShape1 implements Shape Shape r1 = new Rectangle();Shape r2 = new Rectangle();Shape t1 = new Triangle();Overridevoid draw()r1.draw(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論