一、意图
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。
二、适用性
• 你想表示对象的部分-整体层次结构。
• 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
三、组成
——抽象构件角色(Component):为组合中的对象声明接口, 在适当的情况下,也可实现所有类共有接口的缺省行为。
——树叶构件角色(Leaf):在组合中表示叶节点对象,没有子节点,实现抽象构件角色声明的接口。
——树枝构件角色(Composite):在组合中表示分支节点对象,有子节点,实现抽象构件角色声明的接口;存储子部件。
四、两种实现方式
——透明式的组合模式:将管理子构件的方法定义在Component接口中,这样Leaf类就需要处理这些对其意义不大的方法(空实现或抛异常),在接口层次上Leaf和Composite没有区别,即透明性。Component 声明的这些管理子构件的方法对于Leaf来说是不适用的,这样也就带来了一些安全性问题。
——安全式的组合模式:将管理子构件的方法定义在Composite中,这样编译时任何从Leaf 中增加或删除对象的尝试都将被发现,但是由于Leaf和Composite有不同的接口(方法),又失去了透明性。
五、结构
六、简单实现
将管理子构件的方法定义在Composite中,即安全式的组合模式
1.Component
public interface Component
{
public void doSomething();
}
2.Leaf
public class Leaf implements Component
{
@Override
public void doSomething()
{
System.out.println("Leaf doSomething");
}
}
3.Composite
public class Composite implements Component
{
List<Component> childs = new ArrayList<Component>();
public void add(Component child)
{
this.childs.add(child);
}
public void remove(Component child)
{
this.childs.remove(child);
}
public Component getChild(int i)
{
return this.childs.get(i);
}
@Override
public void doSomething()
{
for (Component child : childs)
child.doSomething();
}
}
4.Client
public class Client
{
public static void main(String[] args)
{
/**
* composite1
* / \
* leaf1 composite2
* / \
* leaf2 leaf3
*
* */
Component leaf1=new Leaf();
Component leaf2=new Leaf();
Component leaf3=new Leaf();
Composite composite1=new Composite();
Composite composite2=new Composite();
composite2.add(leaf2);
composite2.add(leaf3);
composite1.add(leaf1);
composite1.add(composite2);
composite1.doSomething();
}
}
七、其他
1.组合模式让我们能用树形方式创建对象的结构,树里面包含了Composite以及Leaf的对象。使用组合结构,我们能把相同的操作应用在Composite和Leaf上,即大多数情况下,我们可以忽略Composite和Leaf之间的差别,以相同的方式使用它们。为了保持透明性,Leaf和Composite都要继承或实现Component。
2.让管理子构件的方法如add()、remove()、getChild()等出现在Leaf中,是因为我们可以将Leaf看作是没有子构件的节点。
3.《设计模式》一书认为:在组合模式中,相对于安全性,我们比较强调透明性。对于透明式的组合模式中的Leaf内不需要的方法可以使用空处理或者异常报告的方式来解决。
4.Component中可以有一个指向父亲的指针,以便在游走时更容易。比如删除树形结构中的某个子树或叶节点(即Composite或Leaf)时会更加方便。
转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8946607