![設計模式總結-組合模式_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a1.gif)
![設計模式總結-組合模式_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a2.gif)
![設計模式總結-組合模式_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a3.gif)
![設計模式總結-組合模式_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/17/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a/dec59cbe-bb6b-48ed-9ad0-ee3bf1d74b8a4.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、- 精品 word 文檔 值得下載 值得擁有 -注:文檔內(nèi)容基本上來自于網(wǎng)上,并加上自己的理解而成。有的覺得網(wǎng)友總結得非常好,就完全照搬下來,供學習之用。然而,有的摘抄并沒有加上原鏈接和出處,請諒解。要點:1. 用于處理樹形結構的問題中,它模糊了簡單元素和復雜元素的概念,客戶程序可以像處理簡單元素一樣來處理復雜元素,從而使得客戶程序與復雜元素內(nèi)部結構解耦。2. 組合模式可以優(yōu)化處理遞歸或者分級數(shù)據(jù)結構。我們可以將組合理解為兩個層面的意思,一個是按“整體-部分”的方式一個將復雜過程組成樹型結構,另一個層面則是強調整個樹的執(zhí)行要有統(tǒng)一的接口,可以被遞歸的調用。3. 應用場景: OS 文件系統(tǒng), J
2、Unit1. (Composite Pattern)組合模式詳解 1:組合模式 (Composite Pattern) 有時候又叫做部分 -整體模式,它使我們樹型結構的問題中,模糊了簡單元素和復雜元素的概念,客戶程序可以像處理簡單元素一樣來處理復雜元素 ,從而使得客戶程序與復雜元素的內(nèi)部結構解耦。組合模式讓你可以優(yōu)化處理遞歸或分級數(shù)據(jù)結構。有許多關于分級數(shù)據(jù)結構的例子,使得組合模式非常有用武之地。關于分級數(shù)據(jù)結構的一個普遍性的例子是你每次使用電腦時所遇到的:文件系統(tǒng)。文件系統(tǒng)由目錄和文件組成。每個目錄都可以裝內(nèi)容。目錄的內(nèi)容可以是文件,也可以是目錄。按照這種方式,計算機的文件系統(tǒng)就是以遞歸結構
3、來組織的。如果你想要描述這樣的數(shù)據(jù)結構,- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -那么你可以使用組合模式Composite 。定義 (GoF 設計模式 ):將對象組合成樹形結構以表示“部分整體”的層次結構。組合模式使得用戶對單個對象和使用具有一致性。涉及角色:1.Component是組合中的對象聲明接口,在適當?shù)那闆r下,實現(xiàn)所有類共有接口的默認行為 。聲明一個接口用于訪問和管理Component子部件。2.Leaf在組合中表示葉子結點對象,葉子結點沒有子結點。3.Composite定義有枝節(jié)點行為,用來存儲子部件,在Component接口中實
4、現(xiàn)與子部件有關操作,如增加(add) 和刪除 (remove)等。適用性以下情況下適用Composite模式:1你想表示對象的部分-整體層次結構2你希望用戶忽略組合對象與單個對象的不同,用戶將統(tǒng)一地使用組合結構中的所有對象??偨Y組合模式解耦了客戶程序與復雜元素內(nèi)部結構,從而使客戶程序可以向處理簡單元素一樣來處理復雜元素。如果你想要創(chuàng)建層次結構,并可以在其中以相同的方式對待所有元素,那么組合模式就是最理想的選擇。本章使用了一個文件系統(tǒng)的例子來舉例說明了組合模式的用途。在這個例子中,文件和目錄都執(zhí)行相同的接口,這是組合模式的關鍵。通過執(zhí)行相同的接口,你就可以用相同的方式對待文件和目錄,從而實現(xiàn)將文
5、件或者目錄儲存為目錄的子級元素。- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -如圖 :舉例如下:java1. package posite;2. /*3. * 文件名稱:4. * 創(chuàng)建人: Fei Wong5. * 創(chuàng)建時間: 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)建時間: 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); /注意:其實這里是一個遞歸調用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)建時間: 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)建時間: 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(總公司財務部 );183. Company shandongCom = new ConcreteCompany(山東分公司 );184.shandongCom.add(new HRDepartment(山東分公司人力資源部 );185.shandongCom.add(new FinanceDepartment(山東分公司賬務部 );186. Company zaozhuangCom = new ConcreteCompany(棗莊辦事處 );187.zaozhuangCom.add(new FinanceDepartment(棗莊辦事處財務部 );188.zaozhu
16、angCom.add(new HRDepartment(棗莊辦事處人力資源部 );189. Company jinanCom = new ConcreteCompany(濟南辦事處 );- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -190.jinanCom.add(new FinanceDepartment(濟南辦事處財務部 );191.jinanCom.add(new HRDepartment(濟南辦事處人力資源部 );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(上海華東分公司賬務部 );197. Company hangzhouCom = new ConcreteCompany(杭州辦事處 );198. hangzhouCom.add(new FinanceDepartment(杭州辦事處財務部 );199. hangzhouCom.add(new HR
18、Department(杭州辦事處人力資源部 );200. Company nanjingCom = new ConcreteCompany(南京辦事處 );201.nanjingCom.add(new FinanceDepartment(南京辦事處財務部 );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:組合模式意在組成任意復雜度的 整體 - 部分 組件層次結構,同時將單個組件或復合組件視為統(tǒng)一的接口。我們可以將組合理解為兩個層面的意思,一個是按“整體-部分”的方式一個將復雜過程組成樹型結構,另一個層面則是強調整個樹的執(zhí)行要有統(tǒng)一的接口,可以被遞歸的調用。光看定義的話一定感覺太抽象了,網(wǎng)上的文章都是抄來抄去那幾篇,內(nèi)容很生硬,我來舉個通俗點的例子解釋一下大家就明白了。(本文系作者原創(chuàng),請尊重作者的權利。本文歡迎轉載,如轉載必須注明作者及出處!)想了解更多JAVA 設計模式嗎?請閱讀博主系列原創(chuàng)作品:我眼中的JAVA 設計
20、模式就拿網(wǎng)上常見的畫圖的例子來說吧,畫圖是一個由簡到難、由局部到整體的過程,假設我們畫下面的一個圖:- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -用程序來實現(xiàn),我們可能會用最原始也是最直觀的方法。public class Picture void drawShape1()/ 畫形狀 1void drawShape2()/ 畫形狀 2void drawShape3()/ 畫形狀 3void drawPicture()drawShape1();drawShape2();drawShape3();上面的代碼很直觀,但問題也很明顯,這樣的代碼是沒有任何重
21、用性可言的,換了另一副畫,哪怕還是這幾個圖形,只是彼此相對位置稍微改動一下就得重新設計代碼,所以我相信這樣的代碼大部分開發(fā)者是不會接受的?;谏厦娴睦碛晌覀儊碇匦略O計代碼,將畫圖過程中可重用的部分抽象出來。class Rectangle/ 輸入四個角的坐標- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -Rectangle(Point a,Point b,Point c,Point d)void drawRectangle()/ 在這里畫矩形class Triangle/ 輸入三個頂點的坐標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)引入了組合的第一層含義,即將復雜的過程進行分解,然后按“整體- 部分”的方式組合成樹型結構。在這里, Picture是整體, Rectangle和 Triangle
23、是部分。- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -上面的代碼看起來比最初的代碼要好很多了,我們實現(xiàn)了可重用部分的抽象。但仔細思考我們會發(fā)現(xiàn)上面的代碼還是不夠完美,如果圖形非常復雜,整個結構的“樹根”部分就會變得非常臃腫,在這里我們指的是drawPicture方法,想象一下一個圖片由上百個圖形組成。為了避免這樣的情況出現(xiàn),我們將畫不同的Shape ( Picture當然也可以看成是一個Shape )的方法名稱統(tǒng)一起來,抽象出一個統(tǒng)一的接口,這樣我們可以用一個類似于遞歸的方式來處理整個過程,看下面的代碼:public interface Shap
24、e/ 畫形狀void draw();class Rectangle implements Shape/ 輸入四個角的坐標Rectangle(Point a,Point b,Point c,Point d)Overridevoid draw()/ 在這里畫矩形class Triangle implements Shape/ 輸入三個頂點的坐標Rectangle(Point a,Point b,Point )Overridevoid draw()/ 在這里畫三角型- 精品 word 文檔 值得下載 值得擁有 - 精品 word 文檔 值得下載 值得擁有 -/ 這是一個復雜的 Shape ,由若干個其它 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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國變速箱第一軸市場調查研究報告
- 2025年中國兩用拉力器市場調查研究報告
- 2025至2031年中國閉路監(jiān)控器材行業(yè)投資前景及策略咨詢研究報告
- 2025年聚氨酯耐用油底漆項目可行性研究報告
- 2025年石油公司油票管理系統(tǒng)項目可行性研究報告
- 2025年燃氣超壓切斷閥項目可行性研究報告
- 2025年橫梁總成項目可行性研究報告
- 惠州2025年廣東惠州龍門縣總醫(yī)院第一批招聘編外人員25人筆試歷年參考題庫附帶答案詳解
- 2025年平紋桃皮絨面料項目可行性研究報告
- 2025年沖壓模具項目可行性研究報告
- 掛靠免責協(xié)議書范本
- 2024年浙江省五校聯(lián)盟高考地理聯(lián)考試卷(3月份)
- 在線心理健康咨詢行業(yè)現(xiàn)狀分析及未來三至五年行業(yè)發(fā)展報告
- 電動三輪車購銷合同
- 淋巴瘤的免疫靶向治療
- 炎癥性腸病的自我管理
- 國防動員課件教學課件
- 《地理信息系統(tǒng)GIS》全套教學課件
- 技術序列學習地圖(2023年)
- 中國銀行(香港)有限公司招聘筆試真題2023
- 15萬噸水廠安裝工程施工組織設計方案
評論
0/150
提交評論