设计模式之组合模式(Composite Pattern)

本文介绍组合模式的概念及其在C#中的实现。通过构建树形结构来表现整体与部分的关系,使得客户端能够一致地处理单个对象和复合对象。文章提供了一个具体的例子,包括抽象组件、树节点和叶节点的定义,并展示了如何创建树形结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式之组合模式(Composite Pattern)


代码下载

1.概念
将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
纯粹利用这种模式写程序的不常见,C#中TreeView与TreeNode类已经包装的功能足够强大。TreeNode就是这种模式的典型应用。

2.类图

Model.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CompositePattern
{
    public class Model
    {
        public string ID
        {
            get;

            set;
           
        }

        public string Name
        {
            get;

            set;
        }
    }
}


AbstractComponect.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CompositePattern
{
    public abstract class AbstractComponect
    {
        public abstract void Add(AbstractComponect mm);


        public abstract void Delete(AbstractComponect mm);


        public abstract string GetData(int indent);
        protected string _Name = "";
        protected Model _Model = null;
        public AbstractComponect(string name)
        {
            _Name = name;
        }
        public AbstractComponect(string name, Model Model)
        {
            _Name = name;
            _Model = Model;
        }

    }
}

Tree .cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CompositePattern
{
    public class Tree : AbstractComponect
    {
        private List<AbstractComponect> _list = null;
        public Tree(string name)
            : base(name)
        {
            _list = new List<AbstractComponect>();
        }

        public override void Add(AbstractComponect mm)
        {
            _list.Add(mm);
        }

        public override void Delete(AbstractComponect mm)
        {
            _list.Remove(mm);
        }

        public override string GetData(int indent)
        {
            string s = new String('—', indent) +
                 "树枝名称:" + _Name + "\r\n";

            foreach (AbstractComponect mmc in _list)
            {
                s += mmc.GetData(indent + 2);
            }

            return s;

        }
    }
}


Leaf.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CompositePattern
{
    public class Leaf : AbstractComponect
    {
       
        public Leaf(string name, Model md)
            : base(name, md)
        {
            
        }

        public override void Add(AbstractComponect mm)
        {
            throw new NotImplementedException();
        }

        public override void Delete(AbstractComponect mm)
        {
            throw new NotImplementedException();
        }

        public override string GetData(int indent)
        {
            return new String('—', indent) +
               "树叶名称:" + _Name +
               ";信息内容:" + _Model.Name + "\r\n";
        }
    }
}


3.测试代码
Tree root = new Tree("树枝1");
root.Add(new Leaf("树叶1.1", new Model() { ID = "1.1", Name = "叶子1" }));
root.Add(new Leaf("树叶1.2", new Model() { ID = "1.2", Name = "叶子2" }));

Tree root2 = new Tree("树枝2");
root2.Add(new Leaf("树叶2.1", new Model() { ID = "2.1", Name = "叶子3" }));
root2.Add(new Leaf("树叶2.2", new Model() { ID = "2.2", Name = "叶子4" }));

root.Add(root2);

this.richTextBox1.Text = root.GetData(1);


3.运行结果

—树枝名称:树枝1
———树叶名称:树叶1.1;信息内容:叶子1
———树叶名称:树叶1.2;信息内容:叶子2
———树枝名称:树枝2
—————树叶名称:树叶2.1;信息内容:叶子3
—————树叶名称:树叶2.2;信息内容:叶子4

代码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值