一.相关例子:
文件系统 ,java.awt.Component
二.UML图:
三.实现方式:
两者的区别在于将所有子类管理方法(诸如add(),remove(),getChild()等方法)放在哪
1.安全式:在Composite类中声明了所有的子类管理方式,可惜这种方法不够透明,Leaf类和Composite类不具有相同的接口
2.透明式:在Component中声明了所有的子类管理方法,可惜这种方法不安全,因为让Leaf"有机会"去处理那些他不该执行的方法,诸如getChild();
四.角色和安全式的实现代码:
1.抽象构件(Component):
package com.se.design.component;
/*
* 这里实现的是安全式的合成模式
* */
public interface Component {
/*
* 返回自己
* */
public Composite getSelf();
/*
* Leaf和Composite共有方法
* */
public void commonMethod();
}
2.树枝构件(Composite):
package com.se.design.component;
import java.util.Enumeration;
import java.util.Vector;
public class Composite implements Component {
// 存放了自己所有的子节点
Vector<Component> components = new Vector<Component>();
@Override
public Composite getSelf() {
return this;
}
@Override
public void commonMethod() {
System.out.println("I'm Composite");
Enumeration<Component> enumeration = components.elements();
while (enumeration.hasMoreElements()) {
((Component) enumeration.nextElement()).commonMethod();
}
}
public void add(Component comoponent) {
this.components.add(comoponent);
}
public void remove(Component component) {
this.components.remove(component);
}
}
3.树叶构件:
package com.se.design.component;
public class Leaf implements Component {
@Override
public Composite getSelf() {
// TODO Auto-generated method stub
return null;
}
@Override
public void commonMethod() {
// TODO Auto-generated method stub
System.out.println("I'm Leaf");
}
}
毕!