将对象以部分-整体的形式组成,如画图,可以画圆,画线,然后组成一幅图片,与装饰部同的是,这里是组合,装饰是扩展,组合模式是一个行为了的整合。但其又统一了部分和整体操作接口的统一性.
接口
// The Interface public interface IComponent <T> { void Add(IComponent <T> c); IComponent <T> Remove(T s); string Display(int depth); IComponent <T> Find(T s); T Name {get; set;} }
整体对象Composite
public class Composite <T> : IComponent <T> { List <IComponent <T>> list = null; public T Name {get; set;} public Composite (T name) { Name = name; list = new List <IComponent <T>> (); } public void Add(IComponent <T> c) { list.Add(c); } // Finds the item from a particular point in the structure // and returns the composite from which it was removed // If not found, return the point as given public IComponent <T> Remove(T s) { holder = this; IComponent <T> p = holder.Find(s); if (holder!=null) { (holder as Composite<T>).list.Remove(p); return holder; } else return this; } IComponent <T> holder=null; // Recursively looks for an item // Returns its reference or else null public IComponent <T> Find (T s) { holder = this; if (Name.Equals(s)) return this; IComponent <T> found=null; foreach (IComponent <T> c in list) { found = c.Find(s); if (found!=null) break; } return found; } // Displays items in a format indicating their level in the composite structure public string Display(int depth) { StringBuilder s = new StringBuilder(new String('-', depth)); s.Append("Set "+ Name + " length :" + list.Count + "\n"); foreach (IComponent <T> component in list) { s.Append(component.Display(depth + 2)); } return s.ToString(); } }
局部对象,注意这里的Add和Remove方法是无效的,因为其非集合.所以接口的这两个方法也是可以去掉的.
// The Component public class Component <T> : IComponent <T> { public T Name {get; set;} public Component (T name) { Name = name; } public void Add(IComponent <T> c) { Console.WriteLine("Cannot add to an item"); } public IComponent <T> Remove(T s) { Console.WriteLine("Cannot remove directly"); return this; } public string Display(int depth) { return new String('-', depth) + Name+"\n"; } public IComponent <T> Find (T s) { if (s.Equals(Name)) return this; else return null; } }
客户端调用
IComponent <string> album = new Composite<string> ("Album"); album.Add(new Component<string>("home.jpg")); album.Add(new Component<string>("home2.jpg")); album.Display(0);