组合模式(Composite Pattern):
组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式。
角色模式与结构:
组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。
示例代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CSharp.DesignPattern.CompositePattern { class Program { static void Main(string[] args) { Component leaf1; Component leaf2; Component composite1; Component composite2; leaf1 = new Leaf(); leaf2 = new Leaf(); composite1 = new Composite(); composite2 = new Composite(); composite2.Add(leaf2); composite1.Add(composite2); composite1.Add(leaf1); composite1.Operation(); Console.ReadLine(); } } // 抽象构件 abstract class Component { public abstract void Add(Component c); public abstract void Remove(Component c); public abstract Component GetChild(int i); public abstract void Operation(); } // 叶子节点 class Leaf : Component { public override void Add(Component c) { // 异常处理或错误提示 } public override void Remove(Component c) { // 异常处理或错误提示 } public override Component GetChild(int i) { // 异常处理或错误提示 return null; } public override void Operation() // 直接实现叶子节点的业务方法 { Console.WriteLine("Leaf Operation..."); } } // 非叶子节点 class Composite : Component { private List<Component> list = new List<Component>(); // 体现组合模式的地方 public override void Add(Component c) { list.Add(c); } public override void Remove(Component c) { list.Remove(c); } public override Component GetChild(int i) { return (Component)list[i]; } public override void Operation() { foreach (Object obj in list) // 体现组合模式的地方 { ((Component)obj).Operation(); // 递归实现业务方法 } } } }