1、模式描述
组合模式属于结构型模式,把多个对象组成树状结构来表示局部与整体,这样用户可以以相同的方式对待单个对象和组合对象。需要注意的是这里的组合和之前系列中,我们说的组合关系(可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能)是两个完全不同的概念哈。
2、模式结构
- 抽象节点类:树枝节点类和叶子节点类的父类,定义它们的行为规范和共有属性。
- 树枝节点类:存在下级节点,需要储存叶子节点类的集合。拥有一个或者多个抽象节点对象
- 叶子节点类:没有下级节点,组合模式最下最小单位。
3、实现逻辑
抽象出共性接口,树枝节点类和叶子节点类同时实现接口,树枝节点类引用接口集合对象,叶子节点引用上级树枝节点对象。
4、实战代码
我们知道文件系统就是一个树状结构,文件夹下面会有文件夹或者文件。在这里文件夹就是树枝节点类,文件就是叶子节点类
/** * 抽象节点类 * * @author Eajur.Wen * @version 1.0 * @date 2022-11-16 00:02:58 */ public interface Node { String getPath(); void print(); } /** * 树枝节点类 * * @author Eajur.Wen * @version 1.0 * @date 2022-11-16 00:04:23 */ public class Directory implements Node { private String path; private List<Node> nodes = new ArrayList<>(); public Directory(String path) { this.path = path; } public Directory(Directory parentPath, String dirName) { parentPath.addChild(this); this.path = parentPath.getPath() + "/" + dirName; } @Override public String getPath() { return this.path; } @Override public void print() { System.out.println("/" + path); for (Node node : this.nodes) { node.print(); } } public void addChild(Node node) { this.nodes.add(node); } } /** * 叶子节点类 * * @author Eajur.Wen * @version 1.0 * @date 2022-11-16 00:05:36 */ public class File implements Node { private String filename; private Directory directory; public File(Directory directory, String filename) { directory.addChild(this); this.filename = filename; } @Override public String getPath() { return this.directory.getPath() + filename; } @Override public void print() { System.out.println("--" + filename); } } /** * 测试类 * * @author Eajur.Wen * @version 1.0 * @date 2022-11-16 07:43:52 */ public class Client { public static void main(String[] args) { Directory rootDir = new Directory("root"); Directory optDir = new Directory(rootDir,"opt"); Directory ectDir = new Directory(rootDir,"ect"); Directory confDir = new Directory(optDir,"conf"); File nginxConf = new File(confDir, "nginx.conf"); File dockerfile = new File(confDir, "Dockerfile"); Directory userDir = new Directory(ectDir, "eajur"); rootDir.print(); System.out.println("-----------------"); optDir.print(); System.out.println("-----------------"); ectDir.print(); } }
5、适用场景
组合模式的目的就是将一系列相似对象组设置为树形结构,方便对某一个节点下的内容进行操作。所以组合模式适用于出现树形结构的地方。例如:多级菜单显示,文件目录显示,多级目录呈现等树形结构数据的操作。