技术开发 频道

窥视设计模式之组合模式(composite)

工厂类为:
1using System; 2using System.Collections.Generic; 3using System.Text; 4using System.Data; 5 6namespace CompositeStudy 7{ 8 /**//// <summary> 9 /// 工厂类 10 /// </summary> 11 /// <remarks>工厂类</remarks> 12 public class ThreadFactory 13 { 14 DataTable table = new DataTable(); 15 public ThreadFactory() 16 { 17 table.Columns.Add("content"); 18 table.Columns.Add("IsTop"); 19 table.Columns.Add("IsMessage"); 20 table.Columns.Add("ID"); 21 table.Columns.Add("ParentID"); 22 23 DataRow row = table.NewRow(); 24 row["content"] = "test"; 25 row["IsTop"] = false; 26 row["IsMessage"] = false; 27 row["ID"] = 1; 28 row["ParentID"] = 0; 29 table.Rows.Add(row); 30 31 row = table.NewRow(); 32 row["content"] = "test1"; 33 row["IsTop"] = true; 34 row["IsMessage"] = false; 35 row["ID"] = 0; 36 row["ParentID"] = -1; 37 table.Rows.Add(row); 38 39 row = table.NewRow(); 40 row["content"] = "test2"; 41 row["IsTop"] = false; 42 row["IsMessage"] = true; 43 row["ID"] = 2; 44 row["ParentID"] = 0; 45 table.Rows.Add(row); 46 47 row = table.NewRow(); 48 row["content"] = "test3"; 49 row["IsTop"] = false; 50 row["IsMessage"] = true; 51 row["ID"] = 3; 52 row["ParentID"] = 0; 53 table.Rows.Add(row); 54 } 55 public List<IThread> GetTopThreads() 56 { 57 List<IThread> list = new List<IThread>(); 58 DataRow[] rows = table.Select("IsTop = true"); 59 foreach (DataRow row in rows) 60 { 61 Thread t = new Thread(); 62 t.Content = row["content"].ToString(); 63 t.IsTop = true; 64 DataRow[] cs = table.Select("ParentID="+Convert.ToInt32(row["ID"])); 65 foreach (DataRow r in cs) 66 { 67 if (Convert.ToBoolean(r["IsMessage"])) 68 { 69 Message m = new Message(); 70 m.Content = r["content"].ToString(); 71 m.IsTop = false; 72 t.Add(m); 73 } 74 else 75 { 76 Thread tt = new Thread(); 77 tt.Content = r["content"].ToString(); 78 tt.IsTop = false; 79 t.Add(tt); 80 } 81 } 82 list.Add(t); 83 } 84 return list; 85 } 86 } 87}
客户端调用方法为:
1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace CompositeStudy 6{ 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 ThreadFactory factory = new ThreadFactory(); 12 List<IThread> threads = factory.GetTopThreads(); 13 foreach(IThread t in threads) 14 { 15 t.RenderContent(); 16 } 17 Console.Read(); 18 } 19 } 20} 21

类关系图:


输结果为:
通过该事例的调用,就可以知道,组合模式的好处有:

1)         使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关心自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。

 

 

 

2)       更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。这一点符合开闭原则的要求,对系统的二次开发和功能扩展很有利!

0
相关文章