组合模式

来源:互联网 发布:复杂网络期刊 sci 编辑:程序博客网 时间:2024/06/09 18:04

一、什么是组合模式?

       将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

 二、角色:

         1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component
         子部件。
      2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
      3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除

三、类图

、代码类

package com.qtong.util;


import java.util.ArrayList;
import java.util.List;


public class ComponentDemo {
  public abstract class Component {  
       String name;  
 
       public abstract void add(Component c);  
 
       public abstract void remove(Component c);  
 
       public abstract void eachChild();  
   }  
 
   // 组合部件类  
   public class Leaf extends Component {  
 
       // 叶子节点不具备添加的能力,所以不实现  
       @Override  
       public void add(Component c) {  
           // TODO Auto-generated method stub  
           System.out.println("");  
       }  
 
       // 叶子节点不具备添加的能力必然也不能删除  
       @Override  
       public void remove(Component c) {  
           // TODO Auto-generated method stub  
           System.out.println("");  
       }  
 
       // 叶子节点没有子节点所以显示自己的执行结果  
       @Override  
       public void eachChild() {  
           // TODO Auto-generated method stub  
           System.out.println(name + "出山了。。。。。");  
       }  
 
   }  
 
   // 组合类  
   public class Composite extends Component {  
 
       // 用来保存节点的子节点  
       List<Component> list = new ArrayList<Component>();  
 
       // 添加节点 添加部件  
       @Override  
       public void add(Component c) {  
           // TODO Auto-generated method stub  
           list.add(c);  
       }  
 
       // 删除节点 删除部件  
       @Override  
       public void remove(Component c) {  
           // TODO Auto-generated method stub  
           list.remove(c);  
       }  
 
       // 遍历子节点  
       @Override  
       public void eachChild() {  
           // TODO Auto-generated method stub  
           System.out.println(name + "出山了。。。。");  
           for (Component c : list) {  
               c.eachChild();  
           }  
       }  
   }  
 
   public static void main(String[] args) {  
       ComponentDemo demo = new ComponentDemo();  
       // 构造根节点  
       Composite rootComposite = demo.new Composite();  
       rootComposite.name = "老大";  
 
       // 左节点  
       Composite compositeLeft = demo.new Composite();  
       compositeLeft.name = "左护卫";  
 
       // 构建右节点,添加两个叶子几点,也就是子部件  
       Composite compositeRight = demo.new Composite();  
       compositeRight.name = "右护卫";  
       Leaf leaf1 = demo.new Leaf();  
       leaf1.name = "右-子护卫1";  
       Leaf leaf2 = demo.new Leaf();  
       leaf2.name = "右-子护卫2";  
       compositeRight.add(leaf1);  
       compositeRight.add(leaf2);  
 
       // 左右节点加入 根节点  
       rootComposite.add(compositeRight);  
       rootComposite.add(compositeLeft);  
       // 遍历组合部件  
       rootComposite.eachChild();  
   }  
}
 

执行结果:

老大出山了。。。。
右护卫出山了。。。。
右-子护卫1出山了。。。。。
右-子护卫2出山了。。。。。
左护卫出山了。。。。

五、适用场景

1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

六、优缺点

优点:
组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。
缺点:
 在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程较为复杂。


0 0
原创粉丝点击