合成模型模式(Composite)属于队形的结构模式,有时又叫做部分-整体模式(Part-Whole)。
合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。
合成模式可以使客户端将单纯元素与复合元素同等看待。
有向树结构的种类:
这里仅给出由上向下的示意图
一个树结构由两种节点组成:树枝节点和树叶节点。树枝节点可以有子节点,而一个树叶节点不可以有子节点。
在信息系统里,树枝节点所代表的构件常常用作树叶节点所代表的构件的容器。
合成模式把部分和整体的关系用树结构表示出来。
从这个简略类图,可以看出,涉及三个角色:
分成两类:
透明方式,
会在Component里面声明所有的用来管理子类对象的方法,包括 add(), remove() , 以及 getChild() 方法。
这样做的好处是所有的构件类都有相同的接口。客户端可以同等对待所有的对象。
缺点是不够安全,因为树叶类对象和合成对象在本质上是由区别的。
安全方法
安全方式,是在Composite 类里面声明所有的用来管理子类对象的方法。
这样的做法是安全的做法,因为树叶类型的对象根本就没有管理子类对象的方法,因此,如果客户端对树叶类对象使用这些方法时,程序会在编译时期出错。
缺点是,不够透明,因为树叶类和合成类将具有不同的接口。
代码清单:
Component
public interface Component {
/**
* 返还自己的实例
* @return
*/
Composite getComposite();
/**
* 某个商业方法
*/
void sampleOperation();
}
Composite
public class Composite implements Component {
private Vector componentVector = new Vector();
/**
* 返还自己的实例
*/
@Override
public Composite getComposite() {
// TODO Auto-generated method stub
return this;
}
/**
* 某个商业方法
*/
@Override
public void sampleOperation() {
Enumeration enumeration = components();
while(enumeration.hasMoreElements()){
((Component)enumeration.nextElement()).sampleOperation();
}
}
/**
* 聚集管理方法,增加一个子构件对象
* @param component
*/
public void add(Component component){
componentVector.addElement(component);
}
/**
* 聚集管理方法,删除一个子构件对象
* @param component
*/
public void remove(Component component){
componentVector.removeElement(component);
}
/**
* 聚集管理方法,返还聚集的Enumeration对象
* @return
*/
public Enumeration components(){
return componentVector.elements();
}
}
Leaf
public class Leaf implements Component {
/**
* 返还自己的实例
*/
@Override
public Composite getComposite() {
// TODO Auto-generated method stub
return null;
}
/**
* 某个商业方法
*/
@Override
public void sampleOperation() {
// TODO Auto-generated method stub
}
}
三个角色: