源代码
1、抽象类Component |
public abstract class Component { protected string name;
public Component(string name) { this.name = name; }
public abstract void Add(Component c); public abstract void Remove(Component c); public abstract void Diaplay(int depth); } |
2、叶子节点Leaf 继承于Component |
public class Leaf:Component {
public Leaf(string name) :base(name) {
}
public override void Add(Component c) { Console.WriteLine("不能向叶子节点添加子节点"); }
public override void Remove(Component c) { Console.WriteLine("叶子节点没有子节点"); }
public override void Diaplay(int depth) { Console.WriteLine(new string('-',depth)+name); } } |
3、组合类Composite继承于Component,拥有枝节点行为 |
public class Composite : Component {
List<Component> children;
public Composite(string name) :base(name) { if (children == null) { children = new List<Component>(); } }
public override void Add(Component c) { this.children.Add(c); }
public override void Remove(Component c) { this.children.Remove(c); }
public override void Diaplay(int depth) { Console.WriteLine(new String('-',depth)+name); foreach (Component component in children) { component.Diaplay(depth + 2); } } }
|
4、客户端代码 |
static void Main(string[] args) { Composite root = new Composite("根节点root"); root.Add(new Leaf("根上生出的叶子A")); root.Add(new Leaf("根上生出的叶子B"));
Composite comp = new Composite("根上生出的分支CompositeX"); comp.Add(new Leaf("分支CompositeX生出的叶子LeafXA")); comp.Add(new Leaf("分支CompositeX生出的叶子LeafXB"));
root.Add(comp);
Composite comp2 = new Composite("分支CompositeX生出的分支CompositeXY"); comp2.Add(new Leaf("分支CompositeXY生出叶子LeafXYA")); comp2.Add(new Leaf("分支CompositeXY生出叶子LeafXYB"));
comp.Add(comp2);
root.Add(new Leaf("根节点生成的叶子LeafC")); Leaf leafD = new Leaf("leaf D"); root.Add(leafD); root.Remove(leafD); root.Diaplay(1); Console.Read(); } |