一、应用场景
某公司开发一个部门-人员管理系统,要求可以对部门和员工进行灵活的增加和删除,并且可以展示部门和部门内的员工。
树状的结构
二、定义
可以将对象组合成树状结构,并且能像使用独立对象一样使用他们。
总结:你的程序需求如果有部分-整体的结构,并且你希望可以忽略单个对象和组合对象的不同,统一的使用组合结构中的所有对象。
。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);