设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。
结构型 包含了 代理模式、 桥接模式、 装饰器模式、适配器模式、门面模式、组合模式、 享元模式。
组合模式
组合模式定义了如何将容器对象和叶子对象进行递归组合,使得客户在使用的过程中无须进行区分,可以对他们进行一致的处理。
组合模式将对象组织为树形结构,每一个对象都是节点,无论是子树和叶子都可以被统计地进行递归处理。
1.定义FileNode 抽象类
public abstract class FileNode {
private String path;
public FileNode(String path) {
this.path = path;
}
public abstract int count();
}
2.定义目录、文件继承于FileNode
public class File extends FileNode {
public File(String path) {
super(path);
}
@Override
public int count() {
return 1;
}
}
public class Directory extends FileNode {
private List<FileNode> subNodes = new ArrayList<>();
public void add(FileNode element) {
subNodes.add(element);
}
public Directory(String path) {
super(path);
}
@Override
public int count() {
int count = 0;
for(FileNode node:subNodes){
count += node.count();
}
return count;
}
}
3.统计所有节点数量
public class Main {
public static void main(String[] args) {
Directory root = new Directory("/");
Directory d = new Directory("/d");
Directory e = new Directory("/e");
FileNode leaf1 = new File("/a.txt");
FileNode leaf2 = new File("/b.txt");
FileNode leaf3 = new File("/c.txt");
FileNode leaf4 = new File("/d/a.txt");
FileNode leaf5 = new File("/d/e/a.txt");
root.add(d);
root.add(leaf1);
root.add(leaf2);
root.add(leaf3);
d.add(leaf4);
d.add(e);
e.add(leaf5);
System.out.println(root.count());
System.out.println(d.count());
System.out.println(e.count());
}
}
运行结果,能够递归进行统计:
5
2
1
总结
组合模式定义了如何将容器对象和叶子对象进行递归组合,使得客户在使用的过程中无须进行区分,可以对他们进行一致的处理。
类似树形结构的业务场景可以考虑组合模式,比如机构+人员,机构有下级机构及员工,因此在OA系统中可以进行这样的设计。
设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。