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

2022-10-12 16:43:59 浏览数 (3)

一、应用场景

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

树状的结构

二、定义

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

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

。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);

0 人点赞