在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。 定义与特点组合(Composite)模式的定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。 组合模式的主要优点有:
其主要缺点是:
结构与实现模式的结构组合模式包含以下主要角色:
组合模式分为透明式的组合模式和安全式的组合模式。
模式的实现假如要访问集合 c0={leaf1,{leaf2,leaf3}} 中的元素,其对应的树状图如图所示: 下面给出透明式的组合模式的实现代码,安全式的组合模式与之类似: class Program { static void Main(string[] args) { IComponent c0=new Composite(); IComponent c1=new Composite(); IComponent leaf1=new Leaf("1"); IComponent leaf2=new Leaf("2"); IComponent leaf3=new Leaf("3"); c0.Add(leaf1); c0.Add(c1); c1.Add(leaf2); c1.Add(leaf3); c0.Operation(); Console.Read(); } } //抽象构件 public interface IComponent { void Add(IComponent c); void Remove(IComponent c); IComponent GetChild(int i); void Operation(); } //树叶构件 public class Leaf : IComponent { private String name; public Leaf(String name) { this.name=name; } public void Add(IComponent c){ } public void Remove(IComponent c){ } public IComponent GetChild(int i) { return null; } public void Operation() { Console.WriteLine("树叶"+name+":被访问!"); } } //树枝构件 public class Composite : IComponent { private List<IComponent> children=new List<IComponent>(); public void Add(IComponent c) { children.Add(c); } public void Remove(IComponent c) { children.Remove(c); } public IComponent GetChild(int i) { return children[i]; } public void Operation() { foreach (var obj in children) { obj.Operation(); } } } 程序运行结果如下: 树叶1:被访问! 树叶2:被访问! 树叶3:被访问! 应用场景前面分析了组合模式的结构与特点,下面分析它适用的以下应用场景:
扩展:树叶节点和树枝节点进行抽象如果对前面介绍的组合模式中的树叶节点和树枝节点进行抽象,也就是说树叶节点和树枝节点还有子节点,这时组合模式就扩展成复杂的组合模式了,如 Java AWT/Swing 中的简单组件 JTextComponent 有子类 JTextField、JTextArea,容器组件 Container 也有子类 Window、Panel。复杂的组合模式的结构图如图所示: |
|