结构型设计模式——组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用方式具有一致性。
适用于
①想表示对象的部分-整体层次结构
②希望用户忽略组合对象和单个对象的不同,用户将统一地适用组合结构中的所有对象。
类图如下

1 /// <summary> 2 /// 公共组合类 3 /// </summary> 4 /// 实现 文件菜单目录 5 internal abstract class MenuComponent 6 { 7 protected string Name { get; set; } 8 protected int Level { get; set; } 9 protected MenuComponent(string name, int level) 10 { 11 this.Name = name; 12 this.Level = level; 13 } 14 /// <summary> 15 /// 公共方法 16 /// </summary> 17 public abstract void Print(); 18 /// <summary> 19 /// 菜单添加菜单文件方法,菜单文件调用报错 20 /// </summary> 21 /// <param name="component"></param> 22 /// <exception cref="NotImplementedException"></exception> 23 public virtual void Add(MenuComponent component) 24 { 25 throw new NotImplementedException(); 26 } 27 /// <summary> 28 /// 菜单删除菜单文件方法,菜单文件调用报错 29 /// </summary> 30 /// <param name="component"></param> 31 /// <exception cref="NotImplementedException"></exception> 32 public virtual void Remove(MenuComponent component) 33 { 34 throw new NotImplementedException(); 35 } 36 37 public virtual string GetChildName() 38 { 39 return Name; 40 } 41 }
1 /// <summary> 2 ///菜单类,继承并且组合Compon类 3 /// </summary> 4 internal class Menu : MenuComponent 5 { 6 private List<MenuComponent> menuComponents = new List<MenuComponent>(); 7 public Menu(string name, int level) : base(name, level) 8 { 9 } 10 11 public override void Print() 12 { 13 for (int i = 1; i <= Level; i++) 14 { 15 Console.Write("--"); 16 } 17 Console.WriteLine(Name); 18 foreach (var item in menuComponents) 19 { 20 item.Print(); 21 } 22 } 23 24 public override void Add(MenuComponent component) 25 { 26 menuComponents.Add(component); 27 } 28 29 public override void Remove(MenuComponent component) 30 { 31 menuComponents.Remove(component); 32 } 33 34 public override string GetChildName() 35 { 36 return base.GetChildName(); 37 } 38 }
1 /// <summary> 2 /// 菜单文件类 3 /// </summary> 4 internal class MenuItem : MenuComponent 5 { 6 public MenuItem(string name, int level) : base(name, level) 7 { 8 } 9 10 public override void Print() 11 { 12 for (int i = 1; i <= Level; i++) 13 { 14 Console.Write("--"); 15 } 16 Console.WriteLine(Name); 17 } 18 }
1 internal class Program 2 { 3 static void Main(string[] args) 4 { 5 Menu menu1 = new Menu("菜单1", 1); 6 MenuItem menuItem11 = new MenuItem("菜单文件11", 2); 7 menu1.Add(menuItem11); 8 MenuItem menuItem12 = new MenuItem("菜单文件12", 2); 9 menu1.Add(menuItem12); 10 MenuItem menuItem13 = new MenuItem("菜单文件13", 2); 11 menu1.Add(menuItem13); 12 13 Menu menu2 = new Menu("菜单2", 1); 14 MenuItem menuItem21 = new MenuItem("菜单21", 2); 15 menu2.Add(menuItem21); 16 Menu menu22 = new Menu("菜单22", 2); 17 menu2.Add(menu22); 18 MenuItem menuItem221 = new MenuItem("菜单文件221", 3); 19 menu22.Add(menuItem221); 20 21 Menu menu3 = new Menu("菜单3", 1); 22 MenuItem menuItem31 = new MenuItem("菜单文件31", 2); 23 menu3.Add(menuItem31); 24 MenuItem menuItem32 = new MenuItem("菜单文件32", 2); 25 menu3.Add(menuItem32); 26 27 Menu menu = new Menu("菜单", 0); 28 menu.Add(menu1); 29 menu.Add(menu2); 30 menu.Add(menu3); 31 32 menu.Print(); 33 } 34 }


浙公网安备 33010602011771号