1. 基本概念
组合模式是一种结构型设计模式,它将对象组合成树状结构来表示“部分-整体”的层次关系。组合模式使得客户端可以统一处理单个对象和对象的组合,而无需区分它们的具体类型。
2. 基本结构
组合模式包括下面几个角色:
理解起来比较抽象,我们用“省份-城市”举个例子,省份中包含了多个城市,如果将之比喻成一个树形结构,城市就是叶子节点,它是省份的组成部分,而“省份”就是合成节点,可以包含其他城市,形成一个整体,省份和城市都是组件,它们都有一个共同的操作,比如获取信息。
Component
组件: 组合模式的“根节点”,定义组合中所有对象的通用接口,可以是抽象类或接口。该类中定义了子类的共性内容。
Leaf
叶子:实现了Component接口的叶子节点,表示组合中的叶子对象,叶子节点没有子节点。
Composite
合成: 作用是存储子部件,并且在Composite中实现了对子部件的相关操作,比如添加、删除、获取子组件等。
通过组合模式,整个省份的获取信息操作可以一次性地执行,而无需关心省份中的具体城市。这样就实现了对国家省份和城市的管理和操作。
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| interface Component { void operation(); }
class Leaf implements Component { @Override public void operation() { System.out.println("Leaf operation"); } }
class Composite implements Component { private List<Component> components = new ArrayList<>();
public void add(Component component) { components.add(component); }
public void remove(Component component) { components.remove(component); }
@Override public void operation() { System.out.println("Composite operation"); for (Component component : components) { component.operation(); } } }
public class Client { public static void main(String[] args) { Leaf leaf = new Leaf(); Composite composite = new Composite(); composite.add(leaf);
composite.operation(); } }
|
4. 使用场景
组合模式可以使得客户端可以统一处理单个对象和组合对象,无需区分它们之间的差异,比如在图形编辑器中,图形对象可以是简单的线、圆形,也可以是复杂的组合图形,这个时候可以对组合节点添加统一的操作。
总的来说,组合模式适用于任何需要构建具有部分-整体层次结构的场景,比如组织架构管理、文件系统的文件和文件夹组织等。