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

组合模式,有时又叫部分-整体模式。

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

java 23种常用设计模式之组合模式(Composite)_第1张图片

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

package com.freedom.composite;

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

public class HeiErDai {
	
	private String name;
	private HeiErDai parent;
	private Vector children = new Vector();
	
	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 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 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 e = tree.root.getChildren();
        tree.printNode(e);
        Enumeration 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

你可能感兴趣的:(java 23种常用设计模式之组合模式(Composite))