说明
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。
UML
角色:
抽象(Component)角色:所有类的公共接口,定义了叶子和容器的共同点。
叶子(Leaf)角色:叶子节点无子节点。
容器(Composite)角色:用来存储子节点,如对子节点的增删操作。
代码
以使用软件管理器安装软件为例,软件概念为抽象角色,定义为公共接口,软件管理器为容器角色,用来储存软件,具体类型的软件为叶子角色,由软件管理器来管理。代码如下。
软件接口
/**
* @author ctl
* @date 2021/1/21
* 软件
* 组合模式中抽象的角色,定义叶子和容器的公共点
*/
public interface Software {
void install();
}
编码软件
/**
* @author ctl
* @date 2021/1/21
* 编码软件
* 组合模式中叶子角色,没有子节点
*/
public class CodeSoftware implements Software {
@Override
public void install() {
System.out.println("安装编码软件...");
}
}
画图软件
/**
* @author ctl
* @date 2021/1/21
* 画图软件
* 组合模式中叶子角色,没有子节点
*/
public class DrawSoftware implements Software {
@Override
public void install() {
System.out.println("安装画图软件...");
}
}
软件管理器
/**
* @author ctl
* @date 2021/1/21
* 软件管理器
* 组合模式中容器的角色,存储子节点并实现增删操作
*/
public class SoftwareManager implements Software {
private List<Software> softwareList = new ArrayList<>();
public void add(Software software) {
softwareList.add(software);
}
public void remove(Software software) {
softwareList.remove(software);
}
@Override
public void install() {
for (Software software : softwareList) {
software.install();
}
}
}
测试类
/**
* @author ctl
* @date 2021/1/21
*/
public class CombinationMain {
public static void main(String[] args) {
SoftwareManager softwareManager = new SoftwareManager();
softwareManager.add(new CodeSoftware());
softwareManager.add(new DrawSoftware());
softwareManager.install();
}
}
结果
完成了由软件管理器统一管理软件安装的操作。
总结
其实上述的例子并没有很完美的运用组合模式,因为设定的层级太少,只是简单的一个示例。
组合模式可以很好的实现一个树形数据结构,如果想要创建一个多层级的数据结构,并且想以同样的操作来对待这些元素,组合模式是一个不错的选择。