标签:style blog class code tar c
模式动机:使用户可以一致性的处理整个树形结构或者树形的一部分;使用户在使用时无需对他们进行区分,可以一致的对待容器对象和叶子对象.
定义:组合多个对象形成树形结构以表示具有 部分-整体 关系的层次结构.组合模式让客户端可以统一对待单个对象和组合对象.
结构型模式
组合模式结构图
结构成员:
抽象构件(Component) 为叶子对象和容器对象声明接口. 这样使客户端可以统一对待这两个对象. 定义了叶子构件和容器构件的行为.
叶子构件(Leaf) 表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为.
容器构件(Composite) 维护了一个抽象构件的集合, 使得容器对象既可以包含容器节点,也可以包含叶子节点. 并且实现了抽象构件中定义的操作成员的方法. 它的操作方法可以递归调用叶子节点的实现方法.
组合模式根据是否将容器构件特有的方法在抽象构件中声明又分为 透明组合模式 和 安全组合模式:
这两种组合模式优缺点正好相反, 透明组合模式的好处:抽象构件中声明了所有用于管理成员对象的方法,确保了所有对象都有相同的接口,客户端可以不用区别对待.
缺点:不够安全,叶子节点不应该有的行为也会有.
实现:
抽象构件
abstract class Component { public abstract void Add(Component c); //增加成员 public abstract void Remove(Component c); //删除成员 public abstract Component GetChild(Component c); //获取成员 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() { //叶子构件具体实现方法 } }
容器构件
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 GetComponent(int i) { return (Component)list[i]; } public override void Operation() { foreach(Object obj in list) { ((Component)obj).Operation(); } } }
标签:style blog class code tar c
原文地址:http://www.cnblogs.com/zhangxs/p/3710410.html