组合模式将对象组合成树状的结构,当我们访问某个对象时,对它包含的所有子对象一致访问,以此递归
举个例子:张三、李四都属于三班,当我们奖励三班时,同样也会奖励张三、李四。此时张三、李四就可以看做三班的子对象,当我们处理三班时,连同张三、李四一起调用
组合模式由一下几个模块组成:
- 抽象构件角色:为树叶构件角色和树枝构件角色提供接口
- 树叶构件角色:叶节点对象,不包含子对象
- 树枝构件角色:枝节点对象,包含子对象
下面通过简单示例认识组合模式:
interface Component {
void add(Component c);
void remove(Component c);
Component getChild(int i);
void operation();
}
class Leaf implements Component {
String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void add(Component c) {
}
@Override
public void remove(Component c) {
}
@Override
public Component getChild(int i) {
return null;
}
@Override
public void operation() {
System.out.println("树叶" + name + "被访问");
}
}
class CompositeTest implements Component {
private List<Component> children = new ArrayList<>();
@Override
public void add(Component c) {
children.add(c);
}
@Override
public void remove(Component c) {
children.remove(c);
}
@Override
public Component getChild(int i) {
return children.get(i);
}
@Override
public void operation() {
for (Component c : children) {
c.operation();
}
}
}
如上所示,当我们调用 CompositeTest 对象的 operation() 方法后,它所有子对象的 operation() 方法会一起调用。
总得来说组合模式用的很少,并且很难设计,需维护对象之间的组合关系,而这种关系往往比较复杂,大家了解即可