1.特色:用树状结构表示“总体-部分”的层次关系,使单个对象(叶节点)与组合对象(枝节点)的使用具备一致性。ide
2.概念:将对象组合成树形结构以表示“部分-总体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具备一致性。this
3.类图:component
4.程序实现:对象
/// <summary> /// 一个抽象构件,声明一个接口用于访问和管理Component的子部件 /// </summary> public abstract class Component { protected string name; public Component(string name) { this.name = name; } /// <summary> /// 增长一个节点 /// </summary> /// <param name="component"></param> public abstract void Add(Component component); /// <summary> /// 移除一个节点 /// </summary> /// <param name="component"></param> public abstract void Remove(Component component); /// <summary> /// 显示层级结构 /// </summary> public abstract void Display(int level); } /// <summary> /// 叶子节点 /// </summary> public class Leaf : Component { public Leaf(string name) : base(name) { } /// <summary> /// 因为叶子节点没有子节点,因此Add和Remove方法对它来讲没有意义,但它继承自Component,这样作能够消除叶节点和枝节点对象在抽象层次的区别,它们具有彻底一致的接口。 /// </summary> /// <param name="component"></param> public override void Add(Component component) { Console.WriteLine("Can not add a component to a leaf."); } /// <summary> /// 实现它没有意义,只是提供了一个一致的调用接口 /// </summary> /// <param name="component"></param> public override void Remove(Component component) { Console.WriteLine("Can not remove a component to a leaf."); } public override void Display(int level) { Console.WriteLine(new string('-',level) + name); } } /// <summary> /// 定义有枝节点的行为,用来存储部件,实如今Component接口中对子部件有关的操做 /// </summary> public class Composite : Component { public Composite(string name) : base(name) { } /// <summary> /// 一个子对象集合,用来存储其下属的枝节点和叶节点 /// </summary> private List<Component> children = new List<Component>(); /// <summary> /// 增长子节点 /// </summary> /// <param name="component"></param> public override void Add(Component component) { children.Add(component); } /// <summary> /// 移除子节点 /// </summary> /// <param name="component"></param> public override void Remove(Component component) { children.Remove(component); } public override void Display(int level) { Console.WriteLine(new string('-', level) + name); // 遍历其子节点并显示 foreach (Component component in children) { component.Display(level+2); } } } class Program { static void Main(string[] args) { // 生成树根,并为其增长两个叶子节点 Component root = new Composite("Root"); root.Add(new Leaf("Leaf A in Root")); root.Add(new Leaf("Leaf B in Root")); // 为根增长两个枝节点 Component branchX = new Composite("Branch X in Root"); Component branchY = new Composite("Branch Y in Root"); root.Add(branchX); root.Add(branchY); // 为BranchX增长页节点 branchX.Add(new Leaf("Leaf A in Branch X")); // 为BranchX增长枝节点 Component branchZ = new Composite("Branch Z in Branch X"); branchX.Add(branchZ); // 为BranchY增长叶节点 branchY.Add(new Leaf("Leaf in Branch Y")); // 为BranchZ增长叶节点 branchZ.Add(new Leaf("Leaf in Branch Z")); // 显示树 root.Display(1); Console.Read(); } }