這可能是你第一個接觸到的Design Pattern - 叡揚資訊

文章推薦指數: 80 %
投票人數:10人

這次要跟大家介紹的是Composite Pattern,這是GoF(Gang of Four)經典的23種設計模式之一,GoF把設計模式分為三種: Creational Patterns; Structural ... 在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長! 若有任何問題請來信:[email protected] 3分鐘閱讀時間 (557個字) 字體大小: + – 訂閱 取消訂閱 [DesignPattern]這可能是你第一個接觸到的DesignPattern 設計 2021/08/29,週日 1561點擊 0評論 簡介 這次要跟大家介紹的是CompositePattern,這是GoF(GangofFour)經典的23種設計模式之一,GoF把設計模式分為三種: CreationalPatterns StructuralPatterns BehavioralPatterns CompositePattern被歸類在StructuralPatterns,這類設計模式著重在類別及物件的組合,形成更龐雜的結構,從而實現新的功能。

Compositepattern的官方定義:將物件(objects)組合(compose)成樹狀結構以表示part-wholehierarchies(可參見文末連結,此處不贅述),這使客戶(clients)能夠一致地(uniformly)對待單個物件和物件的組合。

大家熟悉的檔案系統就是一種Compositepattern的實現,我們進入檔案系統基本上只會看到資料夾(Directory)和檔案(file)這兩種物件,一個資料夾可以包含任意數量的檔案或是資料夾,這麼一來就形成了樹狀的結構,而我們都可以對其進行刪除或是重新命名的動作,這就是定義所說的一致性對待。

只要遇到階層或是樹狀的結構都可以評估看看是否需要套用Compositepattern。

實作 此範例是採用C#實作簡易版的公司職員管理,下圖為UML類別圖,僅有2個類別實作1個介面。

UML類別圖-CompositePattern簡易實作  Program.cs usingSystem; usingSystem.Collections.Generic; namespaceCompositePattern { interfaceIEmployee { //Tosetanemployeename stringName{get;set;} //Tosetanemployeedepartment stringDept{get;set;} //Tosetanemployeedesignation stringDesignation{get;set;} //Todisplayanemployeedetails voidDisplayDetails(); } //LeafNode classEmployee:IEmployee { publicstringName{get;set;} publicstringDept{get;set;} publicstringDesignation{get;set;} //Detailsofaleafnode publicvoidDisplayDetails() { Console.WriteLine($"\t{Name}隸屬於{Dept}頭銜:{Designation}"); } } //Non-leafnode classCompositeEmployee:IEmployee { publicstringName{get;set;} publicstringDept{get;set;} publicstringDesignation{get;set;} //下屬容器 privateListsubordinateList=newList(); //新增員工 publicvoidAddEmployee(IEmployeee) { subordinateList.Add(e); } //移除員工 publicvoidRemoveEmployee(IEmployeee) { subordinateList.Remove(e); } //Detailsofacompositenode publicvoidDisplayDetails() { Console.WriteLine($"\n{Name}隸屬於{Dept}頭銜:{Designation}"); foreach(IEmployeeeinsubordinateList) { e.DisplayDetails(); } } } classProgram { staticvoidMain(string[]args) { Console.WriteLine("***CompositePatternDemo.***"); #region審計委員會 //2名審計委員會員工 Employeee1=newEmployee{Name="John",Dept="審計委員會",Designation="工讀生"}; Employeee2=newEmployee{Name="Daniel",Dept="審計委員會",Designation="組長"}; //審計委員會主管 CompositeEmployeemanager1=newCompositeEmployee{Name="Peter",Dept="審計委員會",Designation="主管"}; //主管Peter旗下新增2名員工 manager1.AddEmployee(e1); manager1.AddEmployee(e2); #endregion #region薪酬委員會 //3名薪酬委員會員工 Employeee3=newEmployee{Name="Maggie",Dept="薪酬委員會",Designation="工讀生"}; Employeee4=newEmployee{Name="Amy",Dept="薪酬委員會",Designation="工讀生"}; Employeee5=newEmployee{Name="Allen",Dept="薪酬委員會",Designation="組長"}; CompositeEmployeemanager2=newCompositeEmployee{Name="Alex",Dept="薪酬委員會",Designation="主管"}; //主管Alex旗下新增3名員工 manager2.AddEmployee(e3); manager2.AddEmployee(e4); manager2.AddEmployee(e5); #endregion #region管理層頂端 CompositeEmployeeCEO=newCompositeEmployee{Name="Tom",Dept="董事會",Designation="執行長"}; //執行長Tom旗下新增2名員工 CEO.AddEmployee(manager1); CEO.AddEmployee(manager2); #endregion Console.WriteLine("\n列出完整組織員工明細:"); CEO.DisplayDetails(); //移除CEO旗下的員工Peter CEO.RemoveEmployee(manager1); Console.WriteLine("\n-----------------------------------------\n"); Console.WriteLine("\n移除Peter後的員工明細:"); CEO.DisplayDetails(); Console.WriteLine("\n-----------------------------------------\n"); Console.WriteLine("\n只列出主管Alex旗下員工明細:"); manager2.DisplayDetails(); Console.WriteLine("\n-----------------------------------------\n"); Console.WriteLine("\n只列出員工John的員工明細:"); e1.DisplayDetails(); //Waitforuser Console.ReadKey(); } } } 程式說明這個範例只有一個C#檔,直接複製程式碼另存為Program.cs檔並加入至VisualStudio創建的Console應用程式專案中即可運行。

main函數是C#程式運行的起始點,可以視為用戶端(client),範例中我們在其中進行了各式操作: 呼叫AddEmployee方法來新增員工,形成樹狀結構 呼叫DisplayDetails方法來顯示員工明細(for迴圈走訪樹狀結構) 呼叫RemoveEmployee方法,移除樹狀結構中的node(CompositeEmployee)或leaf(Employee) 整個樹狀結構中CompositeEmployee作為node,Employee作為leaf,這兩個類別共同實作了IEmployee介面,達到了一致性的對待(都可以顯示員工明細)。

part-wholehierarchies補充說明連結 https://www.open.edu/openlearn/ocw/mod/oucontent/view.php?id=82521§ion=1.3 你覺得這篇文章怎麽樣? 開心(0) 喜愛(0) 驚奇(0) 悲傷(0) 生氣(0) 標籤: 2021部落格鐵人賽 DesignPattern Composite 讓語言學習模型玩歌曲填詞 .NetCore偵測指定檔案或目錄變化時自動執行某些動作 相關文章 讓語言學習模型玩歌曲填詞 經驗分享 .NetCore偵測指定檔案或目錄變化時自動執行某些動作 經驗分享 SeeTestClient連上實體手機 經驗分享 使用OPENJSON及FORJSON剖析及轉換JSON資料(MSSQL) 經驗分享 如何在Hangfire上實作自訂工作重試處理 程式語言 [.Netcore]HttpMessageResponseDownloadFilenotwork 經驗分享   評論 尚無評論 已經注冊了? 這裡登入 Guest 2022/07/11,週一 Captcha圖像 提交您的評論 文章歸檔 2022 一月 (1) 二月 (12) 五月 (1) 2021 三月 (41) 四月 (42) 五月 (34) 六月 (34) 七月 (54) 八月 (28) 九月 (1) 十月 (2) 十一月 (6) 十二月 (3) 2020 一月 (1) 五月 (1) 七月 (13) 八月 (1) 九月 (3) 十月 (2) 十一月 (1) 十二月 (5) 2019 一月 (2) 二月 (1) 三月 (3) 四月 (2) 五月 (6) 六月 (2) 八月 (2) 十月 (2) 十二月 (3) 2018 二月 (5) 三月 (2) 四月 (4) 五月 (2) 六月 (2) 七月 (3) 八月 (7) 九月 (2) 十月 (5) 十一月 (2) 十二月 (4) 2017 一月 (2) 二月 (2) 三月 (4) 四月 (8) 五月 (4) 六月 (4) 七月 (5) 八月 (1) 九月 (2) 十月 (5) 十一月 (4) 十二月 (2) 2016 九月 (15) 十月 (6) 十一月 (6) 十二月 (2) 熱門類別 經驗分享 196 程式語言 184 .NET 47 .NETMVC 13 C# 7 Java 6 TypeScript 3 Python 1 工具平台 73 前端 68 資訊安全 27 最新評論 Guest-TSUN 11五月2022 玩轉Fiddler-HTTP(s)抓包能手&常見「特殊」用途 講得不錯,某速食報報剛推出當年就試過了,不小心用到沒有的優惠還被通報上去,隔天官網公告了(誤隨意下載來路不明的報報APP)... Guest-邱柏仁 29三月2022 [.Netcore]HttpMessageResponseDownloadFilenotwork 既然都要讀取檔案了,怎麼不PhysicalFile就好了呢? PatricyChang(張淑娟) 測試工具Recorder 以公文自訂的attribute為例:data-speed-id="CreateDraft"SideeX-非TAC錄到的大概有這樣的資料: //li[2]/a[1]/span[1]css... Guest-請教您.李禹叡 11一月2022 玩轉Fiddler-HTTP(s)抓包能手&常見「特殊」用途 請教您.李禹叡、 玩轉Fiddler-HTTP(s)抓包能手&常見「特殊」用途2021/08/24,週二 叡揚資訊我在微信裡有小額通內上課回播影片、要下載錄影的片子!我、不懂的地方! 請... RyanLee(李禹叡) 為什麼程式需要單元測試?-視覺化篇 補一下NetFramework+Xunit的Sample https://jenkins.gss.com.tw/job/WebGoat.Net_2019_XUnitTest/ 標籤雲 asp.net ASP.NETCore Asp.NetMVC .NET #javascript 2021部落格鐵人賽 js 前端 security 資安 SQL 資訊安全 IIS docker jenkins git ux ChatBot 前端工程 TypeScript



請為這篇文章評分?