什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就组合模式简要概述。
什么是组合模式
组合模式就是将一组相似的对象组合成一个对象,一般用树形结构来表示。组合模式也叫作部分整体模式,是结构型模式的一种。
应用场景
1、业务对象有树形关系,也就是有部分整体关系。比如文件,菜单等等。
优势与劣势
优点:
简化调用,消费者直接调用组合大对象即可,不用关心和组装内部构造的树形关系。
缺点:
违反了依赖倒置原则(程序要依赖于抽象接口,不要依赖具体实现),一定程度上增加了耦合度。
小试牛刀
我们以文件为例,文件下面包含子文件。
首先创建一个File类,其中包含文件基本属性(名称、大小、备注等)。文件类中增加一个子文件集合,并提供添加子文件的方法。
依赖关系为:
1、创建File文件类,并提供子文件集合操作方法
/**
* 文件
* @author senfel
* @version 1.0
* @date 2022/8/18 9:42
*/
@Data
public class File {
public File(Integer id, String fileName, Double fileSize, String fileDesc) {
this.id = id;
this.fileName = fileName;
this.fileSize = fileSize;
this.fileDesc = fileDesc;
}
private Integer id;
private String fileName;
private Double fileSize;
private String fileDesc;
private List<File> childFile = new ArrayList<>();
public void addFile(File file){
childFile.add(file);
}
@Override
public String toString() {
return "File{" +
"id=" + id +
", fileName='" + fileName + '\'' +
", fileSize=" + fileSize +
", fileDesc='" + fileDesc + '\'' +
", childFile=" + childFile +
'}';
}
}
2、组合模式测试
/**
* 组合模式测试
* @author senfel
* @version 1.0
* @date 2022/8/18 9:50
*/
@SpringBootTest
public class TestCompositePattern {
@Test
public void test(){
//创建文件并按照树形结构组装
File fileDir = new File(1, "文件夹", 5.0, "文件夹");
File file1 = new File(2, "组合模式文件1", 5.0, "组合模式文件1");
File file2 = new File(3, "组合模式文件2", 5.0, "组合模式文件2");
File file3 = new File(4, "组合模式文件3", 5.0, "组合模式文件3");
File file4 = new File(5, "组合模式文件4", 5.0, "组合模式文件4");
File file5 = new File(6, "组合模式文件5", 5.0, "组合模式文件5");
file4.addFile(file5);
file2.addFile(file3);
file1.addFile(file2);
file1.addFile(file4);
fileDir.addFile(file1);
//展示文件树
System.err.println(JSONObject.toJSONString(fileDir));
}
}
测试结果:
{
"childFile": [{
"childFile": [{
"childFile": [{
"childFile": [],
"fileDesc": "组合模式文件3",
"fileName": "组合模式文件3",
"fileSize": 5.0,
"id": 4
}],
"fileDesc": "组合模式文件2",
"fileName": "组合模式文件2",
"fileSize": 5.0,
"id": 3
}, {
"childFile": [{
"childFile": [],
"fileDesc": "组合模式文件5",
"fileName": "组合模式文件5",
"fileSize": 5.0,
"id": 6
}],
"fileDesc": "组合模式文件4",
"fileName": "组合模式文件4",
"fileSize": 5.0,
"id": 5
}],
"fileDesc": "组合模式文件1",
"fileName": "组合模式文件1",
"fileSize": 5.0,
"id": 2
}],
"fileDesc": "文件夹",
"fileName": "文件夹",
"fileSize": 5.0,
"id": 1
}