设计模式(9) ——- 组合模式
- 利用组合模式来处理树形结构,比如操作系统的目录结构、应用软件的菜单
- 组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构的一部分,亦可以一致性地处理树形结构的叶子节点和容器节点。
组合模式概述
- 组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。组合模式对单个对象(即叶子)和组合对象的使用具有一致性,组合模式又可以称为“整体-部分”(Part-Whole)模式,它是一种对象结构型模式。
注意:如果忘记了树形结构,可以参考 <树形结构-维基百科>;还有关于递归的思想可以自己 google
组合模式UML图(不是很标准)
组合模式应用
这里利用组合模式来实现目录树。为了易读,只是简单实现,可以自己扩展。如果你对树形结构有所了解,目录树就不在话下了,这里直接上代码。
package 组合模式; /** * @author kissx on 2017/2/12. */ public interface Node { void traversal(int depth); } //这里的接口并没有 add()、remove()方法,看个人喜好了,建议加上,这里我就不叫了,,, package 组合模式; /** * @author kissx on 2017/2/12. */ public class File implements Node { private String name; public File(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void traversal(int depth) { for (int i = 0; i < depth; i++) { System.out.print("\t"); } System.out.println("|__" + name + ".file"); } } package 组合模式; import java.util.ArrayList; import java.util.List; /** * @author kissx on 2017/2/12. */ public class Folder implements Node{ private List<Node> files = new ArrayList<>(); private String name; public Folder(String name) { this.name = name; } public void add(Node node){ files.add(node); } //下面的方法很重要,可以说是实现组合模式的核心,理解好里面的递归机制就差不多了 @Override public void traversal(int depth) { for (int i = 0; i < depth; i++) { System.out.print("\t"); } System.out.println(name); ++depth; for(Node node:files){ node.traversal(depth); } } public String getName() { return name; } public void setName(String name) { this.name = name; } } package 组合模式; /** * 测试类 * @author kissx on 2017/2/12. */ public class FileSystem { public static void main(String[] args) { Folder root = new Folder("Root"); File f1_1 = new File("测试1"); File f1_2 = new File("测试2"); root.add(f1_1); root.add(f1_2); Folder folder1 = new Folder("文件夹1_1"); Folder folder2 = new Folder("文件夹1_2"); root.add(folder1); root.add(folder2); File f11_1 = new File("测试3"); File f12_1 = new File("测试4"); folder1.add(f11_1); folder2.add(f12_1); Folder folder3 = new Folder("文件夹2_1"); folder1.add(folder3); File f21_1 = new File("测试5"); folder3.add(f21_1); root.traversal(0); } }
总结
- 组合模式就是用来处理树形结构的。是不是感觉很奇妙,利用这种模式就可以很方便的实现树的遍历的。佩服 gang of four!