前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#设计模式——(结构型-组合设计模式)

C#设计模式——(结构型-组合设计模式)

原创
作者头像
用户10053120
发布2022-10-12 16:43:59
5561
发布2022-10-12 16:43:59
举报
文章被收录于专栏:C# 设计原则

一、应用场景

某公司开发一个部门-人员管理系统,要求可以对部门和员工进行灵活的增加和删除,并且可以展示部门和部门内的员工。

树状的结构

二、定义

可以将对象组合成树状结构,并且能像使用独立对象一样使用他们。

总结:你的程序需求如果有部分-整体的结构,并且你希望可以忽略单个对象和组合对象的不同,统一的使用组合结构中的所有对象。

。NET在控件或者界面操作、界面展示等操作,都是使用组合设计模式。

比如说在winform程序开发中,System.Windows.Form.Control类的Add()、Remove()方法就应用了组合设计模式。

三、代码

代码语言:javascript
复制
        //根节点Component
        public  abstract class Component
        {
            public string Name { get; set; }
            public Component(string name)
            {
                this.Name = name;
            }
            public abstract void Add(Component component);
            public abstract void Remove(Component component);
            public abstract void Dispaly(int depth);
        }
        public class DepartComposite : Component
        {
            private List<Component> components = new List<Component>();
            public DepartComposite(string name):base(name)
            {
                
            }
            public override void Add(Component component)
            {
                components.Add(component);
            }

            public override void Dispaly(int depth)
            {
                Console.WriteLine(new string('-',depth)+this.Name);
                foreach (var item in components)
                {
                    //用到递归的思想,多加几个---
                    item.Dispaly(depth + 4);
                }
            }

            public override void Remove(Component component)
            {
                component.Remove(component);
            }
        }
        //Employee是叶子节点,也就是树叶/员工,树叶是无法添加子集的
        public class Empolee : Component
        {
            public Empolee(string name):base(name)
            {

            }
            public override void Add(Component component)
            {
                throw new NotImplementedException();
            }

            public override void Dispaly(int depth)
            {
                Console.WriteLine(new string('-',depth)+this.Name);
            }

            public override void Remove(Component component)
            {
                throw new NotImplementedException();
            }
        }
代码语言:javascript
复制
            //创建一个根节点
            Component company = new DepartComposite("上市大公司");
            //创建部门
            Component dep1 = new DepartComposite("总裁办");
            //创建员工
            Component boss = new Empolee("孙权");
            //把部门添加到公司下
            company.Add(dep1);
            //把员工添加到部门
            dep1.Add(boss);
            company.Dispaly(3);

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档