设计模式之组合设计模式实战 文件展示 树叶子节点
1.组合设计模式实战 文件展示 树叶子节点
-
组合设计模式
- 又叫部分整体模式,将对象组合成树形结构以表示“部分-整体”的层次结构,可以更好的实现管理操作
- 组合模式使得用户可以使用一致的方法操作单个对象和组合对象
- 部分-整体对象的基本操作多数是一样的,但是应该还会有不一样的地方
- 核心:组合模式可以使用一棵树来表示
-
角色
- 组合部件(Component):它是一个抽象接口,表示树根,例子:总行
- 合成部件(Composite):和组合部件类似,也有自己的子节点,例子:总行下的分行
- 叶子(Leaf):在组合中表示子节点对象,注意是没有子节点,例子:最小地方的分行
-
代码示例
import java.util.ArrayList; import java.util.List; /** * 根节点,抽象类,通用的属性和方法 */ abstract class Root { private String name; public Root(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return name; } public abstract void addFile(Root root); public abstract void display(int depth); } /** * 具体的文件夹,里面可以添加子文件夹或文件 */ class Folder extends Root { List<Root> folders = new ArrayList<>(); public Folder(String name) { super(name); } public void setFolders(List<Root> folders) { this.folders = folders; } public List<Root> getFolders() { return folders; } @Override public void addFile(Root root) { folders.add(root); } @Override public void display(int depth) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < depth; i++) { sb.append(" "); } // 打印横线和当前文件名 System.out.println(sb + this.getName()); for (Root r : folders) { // 每个下级,横线多2个 r.display(depth + 2); } } } /** * 叶子节点:这个类没有节点,不用存储其他子类数组 */ class File extends Root { public File(String name) { super(name); } @Override public void addFile(Root root) { } @Override public void display(int depth) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < depth; i++) { sb.append(" "); } // 打印横线和当前文件名 System.out.println(sb + this.getName()); } } public class Main { public static void main(String[] args) { Folder root = new Folder("C://"); Folder desktop = new Folder("桌面"); Folder myComputer = new Folder("我的电脑"); File cFile = new File("C文件"); root.addFile(desktop); root.addFile(myComputer); root.addFile(cFile); File javaFile = new File("HelloWorld.java"); desktop.addFile(javaFile); root.display(0); } }
-
优点
- 客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题
- 方便创建出复杂的层级结构
-
缺点
- 客户端需要花更多时间理清类之间的层次关系