原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dba10g.blog.51cto.com/764602/230210
这一周,MM 告诉我要我见一次家长。听说,他们家计划生育执行的很不好,人丁兴旺啊。她爷爷就有10 几个儿子,儿子每个儿子又有很多儿子,儿子也有很多儿子。 要我一口气记下来,不累死才怪。还好ME 我学会了合成模式。把所有对象之间的关系,组建成一个树。只要告诉某个人,我立刻可以遍历出她所有的儿子信息来。
抽象构件:
package composite;
public interface People {
public People getSelf();//返回自己的实例
public String getName();// 方便测试
public void operator();// 业务方法
}
树叶构件:
package composite;
public class Leaf implements People {
private String name;
public Leaf(String name){
this.name = name;
}
public People getSelf() {
return this;
}
public void operator() {
}
public String getName() {
return name;
}
}
3.树枝构件
package composite;
import java.util.Vector;
public class Composite implements People {
private String name;
private Vector<People> sons = new Vector<People>();
public Composite(String name){
this.name = name;
}
public People getSelf() {
return this;
}
public void add(People son){
sons.add(son);
}
public void operator() {
}
public Vector<People> getSons(){
return sons;
}
public String getName() {
return name;
}
}
客户端
package composite;
import java.util.Enumeration;
import java.util.Vector;
public class Client {
/**
* @param args
*/
public static void iteratorTree(Composite composite){
Vector<People> sons = composite.getSons();
Enumeration<People> enums = sons.elements();
while(enums.hasMoreElements()){
People son =enums.nextElement();
if(son instanceof Composite){
Composite temp = (Composite)son;
System.out.println(son.getName());
iteratorTree(temp);
}else{
System.out.println(son.getName());
}
/*
Composite temp = (Composite)son;//ClassCastException
System.out.println(son.getName());
iteratorTree(temp);
*/
}
}
public static void main(String[] args) {
Composite root = new Composite("爷爷");
Composite son1 = new Composite("儿子1");
Composite son2 = new Composite("儿子2");
People grandson11 = new Leaf("孙子11");
People grandson112 = new Leaf("孙子12");
root.add(son1);
root.add(son2);
son1.add(grandson112);
son1.add(grandson11);
iteratorTree(root);
}
}
合成模式: 有两种方式,1.透明式合成模式、2安全式合成模式。
而以上代码 运用的是安全式合成模式。 因为 树枝构件 和树叶构件 虽然实现同一个接口,但是树枝却有很多自己客制化的方法。 如果树枝构件想访问那些方法,会在编译器过程中报错的,更谈不上运行时了。所以说来,是相对安全的。
另外一中透明式合成模式: 树叶构件和树枝构件拥有相同的方法,这些方法都是来自于抽象构件。说一说来,对于客户端来说,树叶构件和树枝构件都是一样的,没有区别。这势必造成了如果一个树叶对象,访问了树枝方法,具有危险性。
本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/230210