Java-组合-设计模式(十)
说明
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。
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(); } }
结果 完成了由软件管理器统一管理软件安装的操作。
总结
其实上述的例子并没有很完美的运用组合模式,因为设定的层级太少,只是简单的一个示例。
组合模式可以很好的实现一个树形数据结构,如果想要创建一个多层级的数据结构,并且想以同样的操作来对待这些元素,组合模式是一个不错的选择。
下一篇:
python实现的超简单圣诞树