• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

04月
27
C#
设计模式

设计模式-组合模式

发表于 2022-04-27 • 字数统计 2978 • 被 1,590 人看爆

定义

组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。
组合模式让客户端可以统一对待单个对象和组合对象。

组合模式又称为“部分-整体”模式,属于对象结构型模式,它将对象组织到树形结构中,可以用来描述整体与部分的关系。

举例

例如:公司部分(包含:人力资源部、分部、财政部等)的组成,像树形结构一样

结构

组合模式结构图.png

实现

//用于访问和管理Component的子部件
abstract class Component
{
    protected string name;

    public Component(string name)
    {
        this.name = name;
    }

    //功能
    public abstract void Add(Component c);
    public abstract void Remove(Component c);
    public abstract void Display(int depth);
}

//叶节点对象,叶节点没有子节点
class Leaf: Component
{
    public Leaf(string name) : base(name)
    {

    }

    public override void Add(Component c)
    {
        Console.WriteLine("添加");
    }

    public override void Display(int depth)
    {
        Console.WriteLine(new String('-', depth) + name);
    }

    public override void Remove(Component c)
    {
        Console.WriteLine("移除");
    }
}

//定义枝节点行为
class Composite: Component
{
    private List<Component> children = new List<Component>();

    public Composite(string name): base(name)
    {

    }

    public override void Add(Component c)
    {
        children.Add(c);
    }

    public override void Display(int depth)
    {
        Console.WriteLine(new String('-', depth) + name);
        foreach (Component component in children)
        {
            component.Display(depth + 2);
        }
    }

    public override void Remove(Component c)
    {
        children.Remove(c);
    }
}



class Program
{
    static void Main(string[] args)
    {
        Composite root = new Composite("root");     //生成树根
        root.Add(new Leaf("Leaf A"));       //根上叶节点LeafA
        root.Add(new Leaf("Leaf B"));       //根上叶节点LeafB

        Composite comp = new Composite("Composite X");      //根上长出分支CompositeX
        comp.Add(new Leaf("Leaf XA"));          //分枝 Leaf XA
        comp.Add(new Leaf("Lead XB"));          //分枝 Leaf XB

        root.Add(comp);     //添加到根节点上

        Composite comp2 = new Composite("Composite XY");        //分枝Composite X长出两个分支Leaf xYA、LeafxYA
        comp2.Add(new Leaf("Leaf xYA"));        
        comp2.Add(new Leaf("Leaf XYB"));
        comp.Add(comp2);        //将其添加到Composite X分枝上

        root.Add(new Leaf("Leaf C"));       //根节点长出分枝Leaf C、Leaf D
        Leaf leaf = new Leaf("Leaf D");
        root.Add(leaf);

        root.Remove(leaf);      //移除分支Leaf D
        root.Display(1);        //列出树所有节点

    }
}

优点

  • (1)组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,让客户端忽略了层次的差异,方便对整个层次结构进行控制。
  • (2)客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
  • (3)在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合开闭原则。
  • (4)为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。

缺点

在增加新构件时很难对容器中的构件类型进行限制。

适用环境

  • (1)在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。
  • (2)在一个使用面向对象语言开发的系统中需要处理一个树形结构。
  • (3)在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一此新的类型。
分享到:
设计模式-装饰模式
设计模式-桥接模式
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,080次看爆
  • JAVA_HOME环境配置问题 3,731次看爆
  • AssetBundle使用 3,499次看爆
  • VSCode配置C++开发环境 3,257次看爆
  • Lua反射 3,133次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图