介绍
组合的定义为:将对象组合成树形结构以表示部分和整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
这句话有两层意思:
- 树形结构:学过基本数据结构的都知道这个,也就是说组合模式必须先是树形结构。
- 具有一致性:意思就是树枝和树干必须提供一致接口,给用户的使用感觉就是无区分。
这么一看,组合模式就很简单,生后中的例子就很多了:家谱关系图,书本的目录,公司的组织结构等等,都是这个模式最好的实践例子。
使用方式
public interface Component {
public void doSomething();
}
public class Leaf implements Component {
private String mName;
public Leaf(String name)
{
mName = name;
}
@Override
public void doSomething() {
System.out.println("Leaf"+mName+" doSomething");
}
}
public class Composite implements Component {
private List<Component> mComponents= new ArrayList<>();
@Override
public void doSomething() {
System.out.println("Composite doSomething\n{");
for(Component component:mComponents)
{
component.doSomething();
}
System.out.println("}");
}
public void addComponent(Component component)
{
mComponents.add(component);
}
public void removeComponent(Component component)
{
mComponents.remove(component);
}
}
public class Main {
private static List<Component> mComponent = new ArrayList<>();
public static void main(String[] args) throws Exception {
Leaf leaf1 = new Leaf("1");
Leaf leaf2 = new Leaf("2");
Leaf leaf3 = new Leaf("3");
Composite composite = new Composite();
composite.addComponent(leaf1);
composite.addComponent(leaf2);
composite.addComponent(leaf3);
mComponent.add(leaf1);
mComponent.add(leaf2);
mComponent.add(leaf3);
mComponent.add(composite);
for(Component component:mComponent)
{
component.doSomething();
}
}
}
结果如下:
Leaf1 doSomething
Leaf2 doSomething
Leaf3 doSomething
Composite doSomething
{
Leaf1 doSomething
Leaf2 doSomething
Leaf3 doSomething
}
总结
以上代码中和定义有点区别,个人认为把add
和remove
放到Composite
更合适,毕竟只有Composite
才有这两个业务。
在Android
源码中,View
和ViewGroup
就是典型的例子,不过和这标准的组合模式稍微有点区别,也就是取消了Component
接口,直接让Composite
继承Leaf
类,来保证局部和整体具有一致性,在Composite
类业务完全包含Leaf
类业务的话这种写法既不违背模式定义,又使代码变得简洁,因此,模式的使用应该按照实际需求灵活运用。