组合模式

2023-11-14 17:16:03 浏览数 (1)

设计模式是解决特定问题的优雅和可重用的软件设计解决方案。它们有助于提高我们的代码的可维护性、可读性和可测试性。本篇博文将会介绍一种结构型设计模式:组合模式 (Composite Pattern),并演示如何在C#中实现它。

什么是组合模式?

组合模式是一种允许你将对象组合成树形结构以表示“部分-整体”的层次结构的设计模式。它使得客户对单个对象和复合对象的使用具有一致性。

组合模式适用场景

当你需要表示对象可能是其它对象的组合,以及希望以统一的方式处理所有对象时,就可以使用组合模式。例如,文件系统、图形用户界面(GUI)中的容器和项、HTML等都是组合模式的常见应用。

如何在C#中实现组合模式?

下面我们通过一个简单的例子来演示如何在C#中实现组合模式。假设我们正在实现一个公司的员工层级结构。

首先,我们创建一个抽象类Employee

代码语言:javascript复制
public abstract class Employee
{
    protected string name;
    protected double salary;

    public Employee(string name, double salary)
    {
        this.name = name;
        this.salary = salary;
    }

    public abstract void Add(Employee employee);
    
    public abstract void Remove(Employee employee);

    public abstract string GetData();
}

接着,我们定义一个叶节点类Developer

代码语言:javascript复制
public class Developer : Employee
{
    public Developer(string name, double salary) : base(name, salary) { }

    public override void Add(Employee employee)
    {
        // This is a leaf node, so we throw an exception to indicate that this operation is not supported.
        throw new NotImplementedException();
    }

    public override void Remove(Employee employee)
    {
        // Same here
        throw new NotImplementedException();
    }

    public override string GetData()
    {
        return $"Name: {name}, Salary: {salary}";
    }
}

然后定义一个复合节点类Manager

代码语言:javascript复制
public class Manager : Employee
{
    private List<Employee> employees;

    public Manager(string name, double salary) : base(name, salary)
    {
         employees = new List<Employee>();
    }

    public override void Add(Employee employee)
    {
        employees.Add(employee);
    }

    public override void Remove(Employee employee)
    {
        employees.Remove(employee);
    }

    public override string GetData()
    {
        string data = $"Name: {name}, Salary: {salary}n";
        
        foreach (var employee in employees)
        {
            data  = "t"   employee.GetData()   "n";
        }

        return data;
    }
}

现在我们能够创建一个公司的员工层级结构,并通过统一的方式处理所有员工:

代码语言:javascript复制
Employee john = new Developer("John Doe", 12000);
Employee jane = new Developer("Jane Doe", 15000);

Manager manager = new Manager("Bob Smith", 25000);
manager.Add(john);
manager.Add(jane);

Console.WriteLine(manager.GetData());

结论

组合模式提供了一种优雅的方式来处理复杂的层次结构,它允许我们以统一的方式处理个别和组合的对象。不过也要注意,如果你的系统并不需要处理这样的复杂结构,那么使用组合模式可能会引入不必要的复杂性。

0 人点赞