简介
1、⼜叫部分整体模式,将对象组合成树形结构以表示“部分-整体”的层次结构,可以更好的实现管理操作
2、组合模式使得⽤户可以使⽤⼀致的⽅法操作单个对象和组合对象
3、部分-整体对象的基本操作多数是⼀样的,但是应该还会有不⼀样的地⽅
4、核⼼:组合模式可以使⽤⼀棵树来表示
应⽤场景
1、银⾏总⾏,总⾏有前台、后勤、⽹络部⻔等,辖区下还有地⽅分⾏,也有前台、后勤、⽹络部⻔,最⼩的分⾏就没有⼦分⾏了
2、公司也是,总公司下有⼦公司,每个公司⼤部分的部⻔都类似
3、⽂件夹和⽂件,都有增加、删除等api,也有层级管理关系
4、当想表达对象的部分-整体的层次结构
5、当我们的要处理的对象可以⽣成⼀颗树形结构,我们要对树上的节点和叶⼦进⾏操作时,它能够提供⼀致的⽅式,⽽不⽤考虑它是节点还是叶⼦
角色
1、组合部件(Component):它是⼀个抽象接⼝,表示树根,例⼦:总⾏
2、合成部件(Composite):和组合部件类似,也有⾃⼰的⼦节点,例⼦:总⾏下的分⾏
3、叶⼦(Leaf):在组合中表示⼦节点对象,注意是没有⼦节点,例⼦:最⼩地⽅的分⾏
demo
创建根节点
/**
* 根节点,抽象类,通用的属性和方法
**/
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);
}
创建文件夹
/**
* 具体的文件夹,里面可以添加子文件夹或者文件
**/
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){
//每个下级,横线多2个
r.display(depth+2);
}
}
}
11
/**
* 这个类是没有节点,不用存储其他子类数组,所以是叶子节点
**/
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());
}
}
测试
public class Main {
public static void main(String[] args) {
//创造根文件夹
Root root1 = new Folder("C://");
//建立子文件
Root desktop = new Folder("桌面");
Root myComputer = new Folder("我的电脑");
//建立子文件
Root javaFile = new File("HelloWorld.java");
//建立文件夹关系
root1.addFile(desktop);
root1.addFile(myComputer);
//建立文件关系
myComputer.addFile(javaFile);
//从0级开始展示,每下一级,多2条横线
root1.display(0);
//另外一个根
Root root2 = new Folder("D://");
root2.display(0);
}
}
结果
C://
--桌面
--我的电脑
---HelloWorld.java
D://