合成模式主要是针对树型结构进行的一种模式的界定,一般只要业务需求中含有树型结构都可以考虑用这种模式。
合成模式可以分为安全的合成模式和透明的合成模式。
安全的合成模式是指叶子节点不含有增删操作,而只有树枝节点才会有对应的增删节点的操作。
安全的合成模式的静态UML类图结构如下图所示:
下面是安全的合成模式的参考性代码:
构件Component角色代码如下:
public interface Component {
//返回自己的实例,可以考虑再加一些方法比如返回父节点的实例
CompositegetComposite();
void sampleOperation();
}
树枝节点Composite的代码如下:
public class Composite implements Component {
private Vector componentVector = new java.util.Vector();
public CompositegetComposite(){
return this;
}
public void sampleOperation(){
java.util.Enumerationenumeration = components();
while(enumeration.hasMoreElements()) {
((Component)enumeration.nextElement()).sampleOperation();
}
}
public void add(Componentcomponent){
componentVector.addElement(component);
}
public void remove(Componentcomponent){
componentVector.removeElement(component);
}
public Enumerationcomponents(){
return componentVector.elements();
}
}
叶子节点Leaf的代码如下:
public class Leaf implements Component {
//返回父节点对象
public CompositegetComposite(){
// Write your code here
return null;
}
public void sampleOperation(){
// Write your code here
}
}
透明的合成模式是将叶子当成一般的树枝节点看待,然后将树枝节点中所拥有的如增加删除这样的操作提升到抽象层,从而使树枝和叶子节点统一。
下面为透明式合成模式的UML类图结构:
下面给出透明式合成模式的参考实现代码:
抽象构件的代码如下:
public interface Component
{
void sampleOperation();
CompositegetComposite();
void add(Componentcomponent);
void remove(Componentcomponent);
Enumerationcomponents();
}
树枝节点代码如下:
public class Composite implements Component
{
private Vector componentVector = new java.util.Vector();
public CompositegetComposite()
{
return this;
}
public void sampleOperation()
{
java.util.Enumerationenumeration = components();
while(enumeration.hasMoreElements())
{
((Component)enumeration.nextElement()).sampleOperation();
}
}
public void add(Componentcomponent)
{
componentVector.addElement(component);
}
public void remove(Componentcomponent)
{
componentVector.removeElement(component);
}
public Enumerationcomponents()
{
return componentVector.elements();
}
}
叶子节点的代码如下:
public class Leaf implements Component
{
private Vector componentVector = new java.util.Vector();
public void sampleOperation()
{
// Write your code here
}
public void add(Componentcomponent)
{
componentVector.addElement(component);
}
public void remove(Componentcomponent)
{
componentVector.removeElement(component);
}
public CompositegetComposite()
{
// Write your code here
return null;
}
public Enumerationcomponents()
{
// Write your code here
return null;
}
}
在实际使用中,是可以对节点指定父节点的,这样就可以向上追述关系了。当然也仍然是可以在树枝节点中指定其包含的叶子节点以及所拥有的树枝节点。