设计模式 组合模式(composite)
原创
©著作权归作者所有:来自51CTO博客作者朋克版小红帽的原创作品,请联系作者获取转载授权,否则将追究法律责任
组合模式多用于 树形菜单 是抽象的活用(abstract)
比如 用代码怎么实现一个树形菜单
这样写代码 代码已经固化了 Doc和file 如果需要加另一个实体到树形菜单里 这个就扩展不开
我们看一下组合模式的设计图
那么 来实现一个可以扩展的树形菜单
首先来一个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();
}
输出对象
如果想增加别的页 就可以继承 abstract 类 就可以扩展了