软件设计模式白话文系列(十二)组合模式
2023-03-20 15:29:44 时间
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、适用场景
组合模式的目的就是将一系列相似对象组设置为树形结构,方便对某一个节点下的内容进行操作。所以组合模式适用于出现树形结构的地方。例如:多级菜单显示,文件目录显示,多级目录呈现等树形结构数据的操作。
相关文章
- 金融服务领域的大数据:即时分析
- 影响大数据、机器学习和人工智能未来发展的8个因素
- 从0开始构建一个属于你自己的PHP框架
- 如何将Hadoop集成到工作流程中?这6个优秀实践必看
- SEO公司使用大数据优化其模型的5种方法
- 关于Web Workers你需要了解的七件事
- 深入理解HTTPS原理、过程与实践
- 增强分析:数据和分析的未来
- PHP协程实现过程详解
- AI专家:大数据知识图谱——实战经验总结
- 关于PHP的错误机制总结
- 利用数据分析量化协同过滤算法的两大常见难题
- 怎么做大数据工作流调度系统?大厂架构师一语点破!
- 2019大数据处理必备的十大工具,从Linux到架构师必修
- OpenCV中的KMeans算法介绍与应用
- 教大家如果搭建一套phpstorm+wamp+xdebug调试PHP的环境
- CentOS下三种PHP拓展安装方法
- Go语言HTTP Server源码分析
- Go语言HTTP Server源码分析
- 2017年4月编程语言排行榜:Hack首次进入前五十