using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace ConsoleApplication1
{
//叶子节点与非叶子节点皆须实现的功能
abstract class component
{
protected string name;
public component(string name)
{
this.name = name;
}
//这个抽象方法display,在叶子与非叶子中皆要实现它
public abstract void display(int depth);
}
//因为叶了与非叶子节点的特征不同,故display的实现会有不同,这也就是把display单独抽出来放在一个抽象基类的作用吧
class composite : component
{
//节点集合,故用arraylist
private ArrayList children = new ArrayList();
public composite(string name)
: base(name)
{
}
//封装下就可以把指定的参数(对象或值类型)传给arraylist的add方法
//利用已有的系统方法,加强其功能与作用
//采用了抽象基类component,它是叶子与非叶了节点类皆须实现的功能
public void add(component component)
{
children.Add(component);
}
public void remove(component component)
{
children.Remove(component);
}
public override void display(int depth)
{
Console.WriteLine(new string('*',depth)+name);
foreach (component com in children)
com.display(depth+2);
}
}
class leaf : component
{
public leaf(string name)
: base(name)
{ }
public override void display(int depth)
{
Console.WriteLine(new string('*',depth)+name);
}
}
//客户端
class Program
{
static void Main(string[] args)
{
//根节点
composite root = new composite("root");
root.add(new leaf("叶子1"));
root.add(new leaf("叶子2"));
//composite.add(方法参数的类型是component)这就很灵活了,它是抽象基类,而叶子与非叶子皆继承它,所以
//用add可以插入叶子与非叶子的节点了,如果你换成具体的派生类就不这样灵活了,或者说它的扩展性就不好了
composite comp = new composite("composite x");
comp.add(new leaf("leaf xa"));
comp.add(new leaf("leaf xb"));
root.add(comp);
root.display(1);
Console.ReadKey();
}
}
}
写得乱,现在编码水平很差,暂记于此