目录
1.组合设计模式
- 1.又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象
- 2.组合模式使得用户可以使用一致的方法操作单个对象和组合对象
- 3.部分-整体对象的基本操作多数是一样的,但是应该还会有不一样的地方
- 4.核心:组合模式可以使用一棵树来表示
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);
}
@Override
public void addFile(Root root) {
}
@Override
public void removeFile(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.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;
}
@Override
public void addFile(Root root) {
folders.add(root);
}
@Override
public void removeFile(Root root) {
folders.remove(root);
}
@Override
public 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);
}
}