一.概述:组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
二.组合模式经典案例:系统目录结构,网站导航结构等
三.实现代码:通过生活中画图形的案例,复杂图形的画法来自但个图形的组合。
/// <summary> /// 图形抽象类 /// </summary> public abstract class Graphics { public string Name { get; set; } public Graphics(string Name) { this.Name = Name; } public abstract void Draw(); public abstract void Add(Graphics g); public abstract void Remove(Graphics g); }
/// <summary> /// 单一图形线段 /// </summary> public class Line:Graphics { public Line(string Name):base(Name){ } public override void Draw() { Console.WriteLine("画" + this.Name); } public override void Add(Graphics g) { throw new Exception("不能向单图形Line中添加其他的图像"); } public override void Remove(Graphics g) { throw new Exception("不能向单图形Line中移除其他图像"); } }
/// <summary> /// 单一图形圆 /// </summary> public class Circle:Graphics { public Circle(string Name) : base(Name) { } public override void Draw() { Console.WriteLine("画"+this.Name); } public override void Add(Graphics g) { throw new Exception("不能向单一图形圆中添加其他的图像"); } public override void Remove(Graphics g) { throw new Exception("不能向单一图形圆中移除其他的图像"); } }
/// <summary> /// 复杂图形,由简单图形组合而成 /// </summary> public class ComplexGraphics:Graphics { public List<Graphics> complexgraphics = new List<Graphics>(); public ComplexGraphics(string name) : base(name) { } public override void Draw() { foreach (Graphics item in complexgraphics) { item.Draw(); } } public override void Add(Graphics g) { complexgraphics.Add(g); } public override void Remove(Graphics g) { complexgraphics.Remove(g); } }
/// <summary> /// C#设计模式组合模式-透明式的组合模式 /// </summary> class Program { static void Main(string[] args) { ComplexGraphics g = new ComplexGraphics("两条线段组成的复杂图形"); Console.WriteLine("画复杂图形"); g.Add(new Line("线段一")); Line l = new Line("线段二"); g.Add(l); g.Draw(); Console.WriteLine("移除线段二"); g.Remove(l); g.Draw(); } }
涉及角色:
1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
适用性
1.想表示对象的部分-整体层次结构
2.希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。