组合模式,有时又叫部分-整体模式。
在处理类似树形结构的问题时比较方便,就比如家里的家庭成员,老黑家的家谱如下:
老黑有两个儿子,一个叫大黑,一个叫二黑,看代码:
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.youkuaiyun.com/detail/github_22022001/8329277