设计模式之组合模式

定义:组合模式就是把一些现有的对象或者元素,经过组合后组成新的对象,新的对象提供内部方法,可以让我们很方便的完成这些元素或者内部对象的访问和操作。组合模式是将一系列对象组合成树形结构用来表示整体和部分之间的关系,组合模式的主要目的是达到,访问组合对象和访问单个对象具有一致性。这里的组合对象比较特殊,本身他可以是由其他的对象组合而成,同时,这个组合对象又可以是组成更复杂对象的一个部分。如下结构图:日期等单个对象组合成查询组件,查询组件和其他组件或对象组合成分页组件。组合模式以不遵守单一责任原则换取透明性,让Client将组合和叶节点一视同仁。

角色:
1.Component:组合对象或叶子节点的接口
2.Leaf:叶子节点,最末节。
3.Composite:组合节点。
4.Client客户端

优点:组合模式可以降低系统的复杂度,因为我们可以把复杂的组件看作另一个组件的组成部分来处理。组合模式可以很容易的增加新的构件。使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁。

缺点:使用组合模式后,控制树枝构件的类型不太容易。用继承的方法来增加新的行为很困难。

应用:以下实例中,客户端可单独获取叶子对象,也可以通过组合获取叶子对象。
1.声明Component接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public abstract class Component 
{
public void add(Component component)
{

}

public void remove(Component component)
{

}

public Component getChild(int i)
{

}

public void operation()
{

}
}

2.声明叶子节点,叶子节点没有添加和删除节点功能,只实现自身的operation

1
2
3
4
5
6
7
public class Leaf extends Component
{
public Override void operation()
{
/ /your code
}
}

3.声明组合节点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
```
public class Composite extends Component
{
ArrayList<Component> components = new ArrayList<Component>();

public Override void add(Component component)
{
  components.add(component);
}

public Override void remove(Component component)
{
  components.remove(component);
}

public Override Component getChild(int i)
{
  return components.get(i);
}

public Override void operation()
{
for (Component component : components)
{
component.operation();
}
  }
}