在来看合成模式之前我们先来看看一个故事,想必大家都听过, 这里我从网上看见一个网友的举的例子,因为觉得好所以也就拿过来一用;故事如下:
从前有个山,山里有个庙,庙里有个老和尚在给小和尚讲故事,讲的什么故事呢?从前有个山, 山里有个庙……。奶奶的故事要循环多少次,根据你多长时间睡着而定。 在故事中有山、有庙、有和尚、有故事。因此,故事的角色有两种: 一种里面没有其它角色;另一种内部有其它角色。
2:概念
合成模式有时又叫做部分-整体模式(Part-Whole)。合成模式将对象组织到树结构中, 可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。 合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待.
3:对象的树结构
一个树结构由两种节点组成:树枝节点和树叶节点。树枝节点可以有子节点,而一个树叶节点不可以有子节点。除了根节点外,其它节点有且只有一个父节点。
注意:一个树枝节点可以不带任何叶子,但是它因为有带叶子的能力,因此仍然是树枝节点, 而不会成为叶节点。一个树叶节点永远不可能带有子节点。
4:uml图
模式分为安全式和透明式两种:
1).安全式uml图
::
2).透明式uml图:
透明式在Component里面声明了所有的用来管理子类对象的方法, 包括add(),remove和getChild方法,这样做的好处是所有的构件类都有相同的接口.
安全式是在Composite类里面声明管理子类对象的方法,
从图中可以看出,合成模式涉及到三个角色:
(A)抽象构件(Component角色):这是一个抽象角色,它给参加组合的对象规定一个接口,这个接口给出共有的接口及其默认的行为
(B)树叶构件(Leaf)角色:代表参加组合的树叶对象
(C)树枝构件(Composite)角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为
5:代码实现
安全式:
下面是安全的合成模式的参考性代码:
构件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
}
}
透明式:
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;
}
}