目录
🧂1.组合设计模式
🥓2.优缺点
🌭3.核心角色
🍿4.代码实现
1.组合设计模式
2.优缺点
优点
- 1、高层模块调用简单。
- 2、节点自由增加。
缺点
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
3.核心角色
- 1.组件:定义了组合中所有对象的通用接口,可以是抽象类或接口。它声明了用于访问和管理子组件的方法,包括添加、删除、获取子组件等。
- 2.叶子节点:表示组合中的叶子节点对象,叶子节点没有子节点。它实现了组件接口的方法,但通常不包含子组件。
- 3.复合节点:表示组合中的复合对象,复合节点可以包含子节点,可以是叶子节点,也可以是其他复合节点。它实现了组件接口的方法,包括管理子组件的方法。
- 4.客户端:通过组件接口与组合结构进行交互,客户端不需要区分叶子节点和复合节点,可以一致地对待整体和部分。
4.代码实现
文件之间有相应的子文件关系
java">/*** 组件-根节点,抽象类,通用方法和属性*/
public abstract class Root {private String name;public Root(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}/*** 抽象方法*/public abstract void addFile(Root root);public abstract void removeFile(Root root);public abstract void disPlay(int depth);
}
java">/*** 叶子节点:没有叶子节点*/
public class File extends Root {public File(String name) {super(name);}@Overridepublic void addFile(Root root) {}@Overridepublic void removeFile(Root root) {}@Overridepublic void disPlay(int depth) {StringBuilder sb = new StringBuilder();for (int i = 0; i < depth; i++) {sb.append("_");}System.out.println(sb.toString() + this.getName());}
}
java">/*** 符合节点-文件夹可以有子文件夹或子文件*/
public class Folder extends Root {List<Root> folders = new ArrayList<>();public Folder(String name) {super(name);}public List<Root> getFolders() {return folders;}public void setFolders(List<Root> folders) {this.folders = folders;}@Overridepublic void addFile(Root root) {folders.add(root);}@Overridepublic void removeFile(Root root) {folders.remove(root);}@Overridepublic void disPlay(int depth) {StringBuilder sb = new StringBuilder();for (int i = 0; i < depth; i++) {sb.append("_");}System.out.println(sb.toString() + this.getName());for (Root r : folders) {r.disPlay(depth + 2);}}
}
java">public class Main {public static void main(String[] args) {//创建根目录Folder root = new Folder("E://");//创建子文件夹Folder myComputer = new Folder("我的电脑");Folder desktop = new Folder("桌面");//创造子文件File file = new File("hello.java");//建立文件关系root.addFile(file);root.addFile(desktop);root.addFile(myComputer);myComputer.addFile(file);root.disPlay(0);}
}