前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >组合模式

组合模式

作者头像
JusterZhu
发布2023-11-14 17:16:03
1470
发布2023-11-14 17:16:03
举报
文章被收录于专栏:JusterZhuJusterZhu

设计模式是解决特定问题的优雅和可重用的软件设计解决方案。它们有助于提高我们的代码的可维护性、可读性和可测试性。本篇博文将会介绍一种结构型设计模式:组合模式 (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());

结论

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JusterZhu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是组合模式?
  • 组合模式适用场景
  • 如何在C#中实现组合模式?
  • 结论
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档