概述
组合模式(Composite Pattern)也称为部分整体模式,结构型设计模式之一,组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相对应的对象。
定义
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
使用场景
- 表示对象的部分-整体层次结构
- 从一整体中能够独立出部分模块或功能的场景
UML类图
角色介绍:
Component:抽象根节点
为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子节点。可在递归结构中定义一个接口,用于访问一个父节点,并在合适的情况下实现它。
Composite:定义有子节点的哪些枝干节点的行为,存储子节点,在Component接口中实现与子节点有关的操作。
Leaf:在组合中表示叶子节点对象,叶子节点没有子节点,在组合中定义节点对象的行为。
Client:通过Component接口操纵组合节点的对象。
示例代码
创建抽象根节点
public abstract class Component {
// 节点名称
protected String name;
public Component(String name) {
this.name = name;
}
// 具体逻辑方法由子类实现
abstract void doSomeThing();
}
创建具体枝干节点
public class Composite extends Component {
// 存储子节点
private List<Component> mListComponent;
public Composite(String name) {
super(name);
mListComponent = new ArrayList<>();
}
// 具体逻辑实现
void doSomeThing() {
System.out.println(name);
if (null != mListComponent && mListComponent.size() > 0) {
for (Component component : mListComponent) {
component.doSomeThing();
}
}
}
/**
* 添加子节点
* @param component 预添加的子节点
*/
public void addComponent(Component component) {
mListComponent.add(component);
}
/**
* 移除子节点
* @param component 预移除的子节点
*/
public void removeComponent(Component component) {
mListComponent.remove(component);
}
/**
* 获取子节点
* @param index 子节点的位置
* @return
*/
public Component getComponent(int index) {
if (index < mListComponent.size()) {
return mListComponent.get(index);
}
return null;
}
}
创建叶子节点
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
void doSomeThing() {
System.out.println(name);
}
}
创建测试类
public class TestComponent {
public static void main(String[] args) {
// 创建根节点
Composite mComposite = new Composite("Root");
// 创建枝干节点
Composite compositeA = new Composite("Branch-A");
Composite compositeB = new Composite("Branch-B");
// 创建叶子节点
Leaf leafA = new Leaf("Leaf- A");
Leaf leafB = new Leaf("Leaf- B");
// 将叶子节点添加至枝干节点
compositeA.addComponent(leafA);
compositeA.addComponent(leafB);
// 将枝干节点添加至根节点
mComposite.addComponent(compositeA);
mComposite.addComponent(compositeB);
// 根节点执行逻辑方法
System.out.println("--------- 根节点 - Start ---------");
mComposite.doSomeThing();
System.out.println("--------- 根节点 - End ---------");
// 枝干节点执行逻辑方法
System.out.println("--------- 枝干节点 - Start ---------");
compositeA.doSomeThing();
System.out.println("--------- 枝干节点 - End ---------");
// 叶子节点执行逻辑方法
System.out.println("--------- 叶子节点 - Start ---------");
leafA.doSomeThing();
System.out.println("--------- 叶子节点 - End ---------");
}
}
Log打印
--------- 根节点 - Start ---------
Root
Branch-A
Leaf- A
Leaf- B
Branch-B
--------- 根节点 - End ---------
--------- 枝干节点 - Start ---------
Branch-A
Leaf- A
Leaf- B
--------- 枝干节点 - End ---------
--------- 叶子节点 - Start ---------
Leaf- A
--------- 叶子节点 - End ---------