您的位置:首页 > 编程语言 > Java开发

java 23种常用设计模式之组合模式(Composite)

2015-01-05 16:34 866 查看
组合模式,有时又叫部分-整体模式。

在处理类似树形结构的问题时比较方便,就比如家里的家庭成员,老黑家的家谱如下:



老黑有两个儿子,一个叫大黑,一个叫二黑,看代码:

package com.freedom.composite;

import java.util.Enumeration;
import java.util.Vector;

public class HeiErDai {

private String name;
private HeiErDai parent;
private Vector<HeiErDai> children = new Vector<HeiErDai>();

public HeiErDai(String name){
this.name = name;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public HeiErDai getParent() {
return parent;
}
public void setParent(HeiErDai parent) {
this.parent = parent;
}

//添加孩子节点
public void add(HeiErDai node){
children.add(node);
}

//删除孩子节点
public void remove(HeiErDai node){
children.remove(node);
}

//取得孩子节点
public Enumeration<HeiErDai> getChildren(){
return children.elements();
}

}
package com.freedom.composite;

import java.util.Enumeration;

public class LaoHei {

    HeiErDai root = null;
    static String name = null;
    
    public LaoHei(String name){
        root = new HeiErDai(name);
        this.name = name;
        
    }
    
    //输出各个节点
    public void printNode(Enumeration<HeiErDai> elements){
            
    for(; elements.hasMoreElements();)
                System.out.println(elements.nextElement().getName());
                
                
    }
        
    public static void main(String[] args) {

        LaoHei tree = new LaoHei("老黑");
        HeiErDai oldSon = new HeiErDai("oldSon是大黑……");
        HeiErDai youngSon = new HeiErDai("youngSon是二黑……");
        
        oldSon.add(youngSon);
        tree.root.add(oldSon);
        
        System.out.println("build the tree of "+name+"'s family:");
        Enumeration<HeiErDai> e = tree.root.getChildren();
        tree.printNode(e);
        Enumeration<HeiErDai> e2 = tree.root.getChildren();
        tree.printNode(e2.nextElement().getChildren());
        
    }

}

/*
build the tree of 老黑's family:
oldSon是大黑……
youngSon是二黑……
*/
 
看到了吧,黑二代无论是大黑还是二黑都是老黑的儿子。典型的二叉树模型,主要描述了儿子和父亲的关系,这就是组合模式。

组合模式有两种模式,透明模式和安全模式。上面说的这种是安全模式,透明模式是把用来组合使用的方法放到抽象类中,比如add(),remove()以及getChildren 等方法(顺便说一下,getChildren 一般返回的结果为Iterable的实现类,很多,大家可以看JDK 的帮助),不管叶子对象还是树枝对象都有相同的结构,通过判断是getChildren 的返回值确认是叶子节点还是树枝节点,如果处理不当,这个会在运行期出现问题的,不是很建议的方式;安全模式就不同了,它是把树枝节点和树叶节点彻底分开,树枝节点单独拥有用来组合的方法,这种方法比较安全,我们的例子使用了安全模式。

组合模式的优点有哪些呢?第一个优点只要是树形结构,就要考虑使用组合模式,这个一定记住,只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深,考虑一下组合模式吧。

finish!

下载源码:http://download.csdn.net/detail/github_22022001/8329277
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: