![設(shè)計(jì)模式總結(jié)-組合模式_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a1.gif)
![設(shè)計(jì)模式總結(jié)-組合模式_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a2.gif)
![設(shè)計(jì)模式總結(jié)-組合模式_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a3.gif)
![設(shè)計(jì)模式總結(jié)-組合模式_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a4.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、- 精品 word 文檔 值得下載 值得擁有 -注:文檔內(nèi)容基本上來(lái)自于網(wǎng)上,并加上自己的理解而成。有的覺(jué)得網(wǎng)友總結(jié)得非常好,就完全照搬下來(lái),供學(xué)習(xí)之用。然而,有的摘抄并沒(méi)有加上原鏈接和出處,請(qǐng)諒解。要點(diǎn):1. 用于處理樹形結(jié)構(gòu)的問(wèn)題中,它模糊了簡(jiǎn)單元素和復(fù)雜元素的概念,客戶程序可以像處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素,從而使得客戶程序與復(fù)雜元素內(nèi)部結(jié)構(gòu)解耦。2. 組合模式可以優(yōu)化處理遞歸或者分級(jí)數(shù)據(jù)結(jié)構(gòu)。我們可以將組合理解為兩個(gè)層面的意思,一個(gè)是按“整體-部分”的方式一個(gè)將復(fù)雜過(guò)程組成樹型結(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)的問(wèn)題中,模糊了簡(jiǎn)單元素和復(fù)雜元素的概念,客戶程序可以像處理簡(jiǎn)單元素一樣來(lái)處理復(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、來(lái)組織的。如果你想要描述這樣的數(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è)接口用于訪問(wèn)和管理Component子部件。2.Leaf在組合中表示葉子結(jié)點(diǎn)對(duì)象,葉子結(jié)點(diǎn)沒(méi)有子結(jié)點(diǎn)。3.Composite定義有枝節(jié)點(diǎn)行為,用來(lái)存儲(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)單元素一樣來(lái)處理復(fù)雜元素。如果你想要?jiǎng)?chuàng)建層次結(jié)構(gòu),并可以在其中以相同的方式對(duì)待所有元素,那么組合模式就是最理想的選擇。本章使用了一個(gè)文件系統(tǒng)的例子來(lái)舉例說(shuō)明了組合模式的用途。在這個(gè)例子中,文件和目錄都執(zhí)行相同的接口,這是組合模式的關(guān)鍵。通過(guò)執(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ù)雜過(guò)程組成樹型結(jié)構(gòu),另一個(gè)層面則是強(qiáng)調(diào)整個(gè)樹的執(zhí)行要有統(tǒng)一的接口,可以被遞歸的調(diào)用。光看定義的話一定感覺(jué)太抽象了,網(wǎng)上的文章都是抄來(lái)抄去那幾篇,內(nèi)容很生硬,我來(lá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)上常見(jiàn)的畫圖的例子來(lái)說(shuō)吧,畫圖是一個(gè)由簡(jiǎn)到難、由局部到整體的過(guò)程,假設(shè)我們畫下面的一個(gè)圖:- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -用程序來(lái)實(shí)現(xiàn),我們可能會(huì)用最原始也是最直觀的方法。public class Picture void drawShape1()/ 畫形狀 1void drawShape2()/ 畫形狀 2void drawShape3()/ 畫形狀 3void drawPicture()drawShape1();drawShape2();drawShape3();上面的代碼很直觀,但問(wèn)題也很明顯,這樣的代碼是沒(méi)有任何重
21、用性可言的,換了另一副畫,哪怕還是這幾個(gè)圖形,只是彼此相對(duì)位置稍微改動(dòng)一下就得重新設(shè)計(jì)代碼,所以我相信這樣的代碼大部分開(kāi)發(fā)者是不會(huì)接受的?;谏厦娴睦碛晌覀儊?lái)重新設(shè)計(jì)代碼,將畫圖過(guò)程中可重用的部分抽象出來(lái)。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ù)雜的過(guò)程進(jìn)行分解,然后按“整體- 部分”的方式組合成樹型結(jié)構(gòu)。在這里, Picture是整體, Rectangle和 Triangle
23、是部分。- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -上面的代碼看起來(lái)比最初的代碼要好很多了,我們實(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)一起來(lái),抽象出一個(gè)統(tǒng)一的接口,這樣我們可以用一個(gè)類似于遞歸的方式來(lái)處理整個(gè)過(guò)程,看下面的代碼: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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 統(tǒng)編六上《青山不老》教學(xué)設(shè)計(jì)
- 教學(xué)設(shè)計(jì)方案作業(yè)
- XX公司天花吊頂施工合作合同
- 個(gè)人貸款合同范文及格式
- 個(gè)人保證擔(dān)保借款合同書正式版
- 臨街門面租賃合同標(biāo)準(zhǔn)版
- 中鐵物資商城物流配送合同新范本
- 個(gè)人住房抵押借款合同模板
- 產(chǎn)品生產(chǎn)裝配標(biāo)準(zhǔn)化合同
- 采購(gòu)預(yù)付款合同范本
- crrt的治療與護(hù)理
- 醫(yī)院定崗定編
- 【重慶長(zhǎng)安汽車公司績(jī)效管理現(xiàn)狀、問(wèn)題及優(yōu)化對(duì)策(7600字論文)】
- 計(jì)算機(jī)網(wǎng)絡(luò)畢業(yè)論文3000字
- 2023年大學(xué)物理化學(xué)實(shí)驗(yàn)報(bào)告化學(xué)電池溫度系數(shù)的測(cè)定
- 農(nóng)村公共基礎(chǔ)知識(shí)
- 腦出血的護(hù)理課件腦出血護(hù)理查房PPT
- 煤礦機(jī)電運(yùn)輸安全培訓(xùn)課件
- 扣繳個(gè)人所得稅報(bào)告表-(Excel版)
- Unit+4+History+and+Traditions單元整體教學(xué)設(shè)計(jì)課件 高中英語(yǔ)人教版(2019)必修第二冊(cè)單元整體教學(xué)設(shè)計(jì)
- 2023年全國(guó)自學(xué)考試00054管理學(xué)原理試題答案
評(píng)論
0/150
提交評(píng)論