结构型设计模式——组合模式

将对象组合成树形结构以表示“部分-整体”的层次结构。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     }
View Code
 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     }
View Code
 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     }
View Code
 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     }
View Code

 

posted @ 2025-04-10 21:41  是铭不是明  阅读(8)  评论(0)    收藏  举报