组合模式

组合模式是树形结构的管理,例如组织结构,文件系统等。

组合模式有三个角色,一个是抽象构件,一个是容器构件,一个是叶子构件,容器构件和叶子构件的区别就是容器构件可以添加删除子容器或者叶子,叶子构件没有此功能。

组合模式分为透明组合模式和安全组合模式,其区别是透明模式会把增加或者删除子节点的方法抽象到抽象构件里,安全组合模式则只有容器构件和叶子构件公共的方法。

示例代码:

透明组合模式

/// <summary>
/// 抽象公共方法组件
/// </summary>
public abstract class Company_Component
{
public string name { get; set; }
public Company_Component(string name)
{
this.name = name;
}
public abstract void Operation();
public abstract void AddChild(Company_Component component);
public abstract void RemoveChild(Company_Component component);
}

 

/// <summary>
/// 实现枝节点
/// </summary>
public class Company_Composite : Company_Component
{
public string name { get; set; }
public List<Company_Component> company_Components;
public Company_Composite(string name) : base(name)
{
this.name = name;
this.company_Components = new List<Company_Component>();
}
public override void Operation()
{
Console.WriteLine("组合节点" + name + "的操作");
//调用所有子节点的操作
foreach (var item in company_Components)
{
item.Operation();
}
}
public override void AddChild(Company_Component component)
{

Console.WriteLine($"当前节点:{this.name}添加---{component.name}节点");
company_Components.Add(component);
}
public override void RemoveChild(Company_Component component)
{
company_Components.Remove(component);
}
}

/// <summary>
/// 实现叶节点
/// </summary>
public class Company_Leaf : Company_Component
{

public Company_Leaf(string name) : base(name)
{
}

public override void AddChild(Company_Component component)
{
Console.WriteLine("叶节点不能添加节点");
}

public override void Operation()
{
Console.WriteLine("叶节点" + name + "的操作");
}

public override void RemoveChild(Company_Component component)
{
Console.WriteLine("叶节点没有节点");
}
}

/// <summary>
/// 客户端调用
/// </summary>
public void Client()
{
//创建根节点对象
Company_Component component = new Company_Composite("component");
//Console.WriteLine($"当前节点:{component.name}");
//创建两个组合节点对象
Company_Component composite1 = new Company_Composite("composite1");
Company_Component composite2 = new Company_Composite("composite2");

//将两个组合节点对象添加到根节点
component.AddChild(composite1);
component.AddChild(composite2);

//给第一个组合节点对象添加两个叶子节点
Company_Component leaf1 = new Company_Leaf("leaf1");
Company_Component leaf2 = new Company_Leaf("leaf2");
composite1.AddChild(leaf1);
composite1.AddChild(leaf2);

//给第二个组合节点对象添加一个叶子节点和一个组合节点
Company_Component leaf3 = new Company_Leaf("leaf3");
Company_Component composite3 = new Company_Composite("composite3");
composite2.AddChild(leaf3);
composite2.AddChild(composite3);

//给第二个组合节点下面的组合节点添加两个叶子节点
Company_Component leaf4 = new Company_Leaf("leaf4");
Company_Component leaf5 = new Company_Leaf("leaf5");
composite3.AddChild(leaf4);
composite3.AddChild(leaf5);

//执行所有节点的操作
// component.Operation();
}

安全组合模式

/// <summary>
/// 抽象公共方法组件
/// </summary>
public abstract class Company_Components
{
public string name { get; set; }
public Company_Components(string name)
{
this.name = name;
}
public abstract string Operation();
}

/// <summary>
/// 实现枝节点
/// </summary>
public class Company_Composites : Company_Components
{
public string name { get; set; }
public List<Company_Components> company_Components;
public Company_Composites(string name) : base(name)
{
this.name = name;
this.company_Components = new List<Company_Components>();
}
public override string Operation()
{
Console.WriteLine("组合节点" + name + "的操作");
return name;
}
public void AddChild(Company_Components component)
{

Console.WriteLine($"当前节点:{this.name}添加---{component.name}节点");
company_Components.Add(component);
}
public void RemoveChild(Company_Components component)
{
company_Components.Remove(component);
}
}

/// <summary>
/// 实现叶节点
/// </summary>
public class Company_Leafs : Company_Components
{

public Company_Leafs(string name) : base(name)
{
}

public override string Operation()
{
Console.WriteLine("叶节点" + name + "的操作");
return name;
}
}

public void Client()
{
//创建根节点对象
Company_Composites component = new Company_Composites("component");
//Console.WriteLine($"当前节点:{component.name}");
//创建两个组合节点对象
Company_Composites composite1 = new Company_Composites("composite1");
Company_Composites composite2 = new Company_Composites("composite2");

//将两个组合节点对象添加到根节点
component.AddChild(composite1);
component.AddChild(composite2);

//给第一个组合节点对象添加两个叶子节点
Company_Components leaf1 = new Company_Leafs("leaf1");
Company_Components leaf2 = new Company_Leafs("leaf2");
composite1.AddChild(leaf1);
composite1.AddChild(leaf2);

//给第二个组合节点对象添加一个叶子节点和一个组合节点
Company_Leafs leaf3 = new Company_Leafs("leaf3");
Company_Composites composite3 = new Company_Composites("composite3");
composite2.AddChild(leaf3);
composite2.AddChild(composite3);

//给第二个组合节点下面的组合节点添加两个叶子节点
Company_Components leaf4 = new Company_Leafs("leaf4");
Company_Components leaf5 = new Company_Leafs("leaf5");
composite3.AddChild(leaf4);
composite3.AddChild(leaf5);

//执行所有节点的操作
// component.Operation();
}

posted @   求简君  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示