当前位置: 首页 > 编程笔记 >

C#复合模式(Composite Pattern)实例教程

蓝侯林
2023-03-14
本文向大家介绍C#复合模式(Composite Pattern)实例教程,包括了C#复合模式(Composite Pattern)实例教程的使用技巧和注意事项,需要的朋友参考一下

本文以一个简单实例的形式讲述了C#复合模式。分享给大家供大家参考。具体实现方法如下:

一般在显示树形结构时,复合模式有很好的体现。本文实例显示如下部门结构:

如上图所示,有的节点包含子节点,有的节点不包含子节点。不管是什么节点,每个节点就代表一个部门。

首先设计一个关于部门的抽象基类。

public abstract class DepartmentComponent
{
    public string Name { private set; get; }
    public DepartmentComponent(string name)
    {
      this.Name = name;
    }
    public virtual void PrintSupervisorOf(int spacing)
    {
      for (int counter = 0; counter < spacing; counter++)
      {
        Console.Write(" ");
      }
      Console.WriteLine(Name);
    }
}

以上,通过构造函数给属性赋值,通过PrintSupervisorOf(int spacing)方法打印出节点的名称。

接下来设计包含子节点的节点。该类维护着DepartmentComponent类型的集合,提供方法向这个集合中添加节点或从集合中删除节点。

public class DepartmentComposite : DepartmentComponent
{
    private IList<DepartmentComponent> employees;
    public DepartmentComposite(string name) : base(name)
    {
      employees = new List<DepartmentComponent>();
    }
    public void AddDepartment(DepartmentComponent e)
    {
      employees.Add(e);
    }
    public void RemoveDepartment(DepartmentComponent e)
    {
      employees.Remove(e);
    }
    public override void PrintSupervisorOf(int spacing)
    {
      base.PrintSupervisorOf(spacing);
      foreach (DepartmentComponent e in employees)
      {
        e.PrintSupervisorOf(spacing + 1);
      }
    }
}

以上 PrintSupervisorOf(int spacing)方法重写了抽象基类的方法,不仅把本节点的名称打印出来,还使用递归把所有子节点的名称显示出来。

最后设计部包含子节点的节点。

public class Department : DepartmentComponent
{
    public Department(string name) : base(name)
    {
      
    }
    public override void PrintSupervisorOf(int spacing)
    {
      base.PrintSupervisorOf(spacing);
    }
}

客户端部分。

class Program
{
    static void Main(string[] args)
    {
      DepartmentComposite salesDepartment1 = new DepartmentComposite("销售部1");
      Department zhangsan = new Department("张三");
      Department lisi = new Department("李四");
      DepartmentComposite salesDepartment2 = new DepartmentComposite("销售部2");
      DepartmentComposite specialDepartment = new DepartmentComposite("销售部2特别行动组");
      Department wangwu = new Department("王五");
      Department zhaoliu = new Department("赵六");
      DepartmentComposite salesDepartment = new DepartmentComposite("销售部");
      salesDepartment.AddDepartment(salesDepartment1);
      salesDepartment.AddDepartment(salesDepartment2);
      salesDepartment1.AddDepartment(zhangsan);
      salesDepartment1.AddDepartment(lisi);
      salesDepartment2.AddDepartment(specialDepartment);
      specialDepartment.AddDepartment(wangwu);
      specialDepartment.AddDepartment(zhaoliu);
      salesDepartment.PrintSupervisorOf(0);
      Console.ReadKey();
    }
}

程序运行结果如下图所示:

希望本文所述对大家C#程序设计的学习有所帮助。

 类似资料:
  • 本文向大家介绍C#单例模式(Singleton Pattern)实例教程,包括了C#单例模式(Singleton Pattern)实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式讲述了C#单例模式(Singleton Pattern)的实现方法,分享给大家供大家参考。具体实现方法如下: 一般来说,当从应用程序全局的角度来看,如果只允许类的一个实例产生,就可以考虑单例模式。 1.即时

  • 本文向大家介绍C#命令模式(Command Pattern)实例教程,包括了C#命令模式(Command Pattern)实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式讲述了C#命令模式的实现方法,分享给大家供大家参考。具体实现方法如下: 现假设想让遥控器控制电灯的开关、电视机的开关和切换,该如何做? 所有的开、关、切换都是遥控器发出的指令,把这些指令统一抽象成一个接口。 把电灯

  • 本文向大家介绍C#策略模式(Strategy Pattern)实例教程,包括了C#策略模式(Strategy Pattern)实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以一个简单的实例来说明C#策略模式的实现方法,分享给大家供大家参考。具体实现方法如下: 一般来说,当一个动作有多种实现方法,在实际使用时,需要根据不同情况选择某个方法执行动作,就可以考虑使用策略模式。 把动作抽象成接口,

  • 本文向大家介绍C#组合模式实例详解,包括了C#组合模式实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#组合模式。分享给大家供大家参考。具体如下: Company.cs如下: ConcreteCompany.cs如下: FinanceDepartment.cs如下: HRdepartment.cs如下: Program.cs如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍C#备忘录模式(Memento Pattern)实例教程,包括了C#备忘录模式(Memento Pattern)实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以一个简单实例讲述了C#备忘录模式(Memento Pattern)的实现方法。分享给大家供大家参考。具体实现方法如下: 简单来说,备忘录模式就是支持回退操作。假设让一个Notepad支持回退操作,如何实现呢? 首先需要

  • 本文向大家介绍C#装饰器模式(Decorator Pattern)实例教程,包括了C#装饰器模式(Decorator Pattern)实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式详细讲述了C#装饰器模式的实现方法。分享给大家供大家参考。具体实现方法如下: 现假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格。最终呈现出来的效果是:把产品组合的所有元素