合成模型模式属于对象的结构模式。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系,合成模式可以使客户端将单纯元素与复合元素同等看待。
在合成模式的树结构中,有两种节点,一种是无子节点的树叶节点,一种是有子节点的树枝节点。树枝节点是本模式的核心,可称为合成类。在整个合成模式的类结构中,除了两种节点外,还有它们的公共抽象接口。
合成模式所涉及到的主要内容就是把不同的元件纳入到树中来,并分为两种节点来管理。一个容易理解的例子就是文件系统:在文件系统中,目录可以看作是树枝节点,文件可以看成是树叶节点。
合成模式又可以分为两种:
一种是安全型:在接口中不定义合成类所具有的管理方法,比如add、remove等,这样,树叶节点就不用实现这些方法。这种类型的好处是方法严密,但接口不整齐;
另一种是透明型:在接口中定义合成类所具有的管理方法,这样,合成类和树叶类都要实现这些方法,树叶类所提供的方法当然是无意义的。这种类型的好处是接口整齐,但有些混乱。
以下是这两种类型合成模式的示例:
package
composite.safe;
public interface Component ... {
public void function();
}
package composite.safe;
import java.util. * ;
public class Composite implements Component ... {
private Vector vector = new Vector();
public void function() ...{
System.out.println(this + ".function()");
}
public void add(Component c) ...{
vector.add(c);
}
public void remove(Component c) ...{
vector.remove(c);
}
public Enumeration components() ...{
return vector.elements();
}
}
package composite.safe;
public class Leaf implements Component ... {
public void function() ...{
System.out.println(this + ".function()");
}
}
package composite.transparent;
import java.util.Enumeration;
public interface Component ... {
public void function();
public void add(Component c);
public void remove(Component c);
public Enumeration components();
}
package composite.transparent;
import java.util.Enumeration;
import java.util.Vector;
import composite.safe.Component;
public class Composite implements Component ... {
private Vector vector = new Vector();
public void function() ...{
System.out.println(this + ".function()");
}
public void add(Component c) ...{
vector.add(c);
}
public void remove(Component c) ...{
vector.remove(c);
}
public Enumeration components() ...{
return vector.elements();
}
}
package composite.transparent;
import java.util.Enumeration;
public class Leaf implements Component ... {
public void function() ...{
System.out.println(this + ".function()");
}
public void add(Component c) ...{
}
public void remove(Component c) ...{
}
public Enumeration components() ...{
return null;
}
}
public interface Component ... {
public void function();
}
package composite.safe;
import java.util. * ;
public class Composite implements Component ... {
private Vector vector = new Vector();
public void function() ...{
System.out.println(this + ".function()");
}
public void add(Component c) ...{
vector.add(c);
}
public void remove(Component c) ...{
vector.remove(c);
}
public Enumeration components() ...{
return vector.elements();
}
}
package composite.safe;
public class Leaf implements Component ... {
public void function() ...{
System.out.println(this + ".function()");
}
}
package composite.transparent;
import java.util.Enumeration;
public interface Component ... {
public void function();
public void add(Component c);
public void remove(Component c);
public Enumeration components();
}
package composite.transparent;
import java.util.Enumeration;
import java.util.Vector;
import composite.safe.Component;
public class Composite implements Component ... {
private Vector vector = new Vector();
public void function() ...{
System.out.println(this + ".function()");
}
public void add(Component c) ...{
vector.add(c);
}
public void remove(Component c) ...{
vector.remove(c);
}
public Enumeration components() ...{
return vector.elements();
}
}
package composite.transparent;
import java.util.Enumeration;
public class Leaf implements Component ... {
public void function() ...{
System.out.println(this + ".function()");
}
public void add(Component c) ...{
}
public void remove(Component c) ...{
}
public Enumeration components() ...{
return null;
}
}