组合模式多用于 树形菜单  是抽象的活用(abstract)

设计模式 组合模式(composite)_设计模式

比如 用代码怎么实现一个树形菜单

设计模式 组合模式(composite)_根目录_02

设计模式 组合模式(composite)_设计模式_03

设计模式 组合模式(composite)_设计模式_04

这样写代码  代码已经固化了 Doc和file  如果需要加另一个实体到树形菜单里  这个就扩展不开

我们看一下组合模式的设计图

设计模式 组合模式(composite)_树形菜单_05

那么 来实现一个可以扩展的树形菜单

首先来一个abstract Class 这样只要是节点 继承了 这个抽象类 都可以加入到 树形节点中 

public abstract class Composite
{
protected string name;
public Composite(string name)
{
this.name = name;
}
public abstract void add(Composite c);
public abstract void Remove(Composite c);
public abstract void Diaply(int i);
}

页类 或者文件类 不可以当文件夹 这里的add 或者remove 可以用来提示BUG

class Doc:Composite
{

public Doc(string name) : base(name) { }
public override void add(Composite c)
{
throw new NotImplementedException();
}

public override void Remove(Composite c)
{
throw new NotImplementedException();
}

public override void Diaply(int i)
{
Console.WriteLine(new string('-', i) + name);
}
}

文件夹类 可以增删子节点 或者文件

class Files:Composite
{
List<Composite> list = new List<Composite>();
public Files(string name):base(name){}
public override void add(Composite c)
{
list.Add(c);
}

public override void Remove(Composite c)
{
list.Remove(c);
}

public override void Diaply(int i)
{
Console.WriteLine(new string('-', i) + name);

foreach (Composite item in list)
{
item.Diaply(i + 2);
}
}
}
static void Main(string[] args)
{
Files father = new Files("根目录 root");

father.add(new Doc("根目录下的A"));
father.add(new Doc("根目录下的B"));

Files com1 = new Files("跟目录下的AX");
com1.add(new Doc("AX目录下的AA"));
com1.add(new Doc("AX目录下的BB"));

Files com2 = new Files("AX目录下的AXT");
com2.add(new Doc("AXT目录下的AAA"));
com2.add(new Doc("AXT目录下的BBB"));
father.add(com1);
com1.add(com2);
father.Diaply(1);
Console.ReadKey();

}

 

 

输出对象

设计模式 组合模式(composite)_树形菜单_06

 

如果想增加别的页  就可以继承 abstract  类 就可以扩展了