组合模式就是将对象组成类似与树状结构的一种模式。统一叶子对象和组合对象的模式。我们常见的比如文件夹,下面有文件夹以及具体的文件,各种嵌套。包括业务开发过程当中使用到的动态菜单,商品的分类归属等等场景。下面来看下具体的代码。
定义一个File抽象类
这里为什么要在父类抛出异常呢,因为叶子节点其实没有子类,所以就不存在添加,删除的操作。具体情况可以根据业务场景进行设计。
package com.example.design.composite.demo2;
/**
* 定义文件的抽象类,里面包含了查看文件内容,添加文件,删除文件,查找文件的功能。
*/
public abstract class File {
/**
* 列出组合结构
* @param preStr
*/
public abstract void listFile(String preStr);
/**
* 添加
* @param file
* @throws Exception
*/
public void addFile(File file) throws Exception{
throw new Exception("具体文件不支持添加文件");
}
/**
* 删除
* @param file
* @throws Exception
*/
public void removeFile(File file) throws Exception{
throw new Exception("具体文件不支持移除文件文件");
}
/**
* 获取
* @param index
* @return
* @throws Exception
*/
public File getFile(Integer index) throws Exception{
throw new Exception("具体文件不支持获取文件");
}
}
定义组合对象
package com.example.design.composite.demo2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class FileDir extends File {
private String name;
List<File> childFiles=null;
public FileDir(String name) {
this.name=name;
}
/**
*利用递归循环进行处理
*
*
*/
@Override
public void listFile(String preStr){
System.out.println(preStr+"+"+name);
preStr += " ";
if(childFiles!=null && childFiles.size()>0){
for (File file:childFiles) {
file.listFile(preStr);
}
}
}
/**
* 添加文件
* @param file
* @throws Exception
*/
@Override
public void addFile(File file) throws Exception {
if(null!=file){
if (childFiles == null) {
childFiles = new ArrayList<>();
}
childFiles.add(file);
}
}
/**
* 移除文件
* @param file
* @throws Exception
*/
@Override
public void removeFile(File file) throws Exception {
if(null != file){
if (childFiles != null && childFiles.size()>0) {
childFiles.remove(file);
}
}
}
@Override
public File getFile(Integer index) {
if(childFiles!=null&& index>0 && index<childFiles.size()){
return childFiles.get(index);
}
return null;
}
}
定义叶子节点
package com.example.design.composite.demo2;
public class FileItem extends File {
private String name;
public FileItem(String name) {
this.name=name;
}
@Override
public void listFile(String preStr){
System.out.println(preStr+"-"+name);
}
}
进行测试
package com.example.design.composite.demo2;
public class FileTest {
public static void main(String[] args) throws Exception{
File root = new FileDir("根目录");
File levelOne = new FileDir("目录1");
File levelTwo = new FileDir("目录2");
File levelThree = new FileDir("目录3");
root.addFile(levelOne);
root.addFile(levelTwo);
root.addFile(levelThree);
File levelOneOne = new FileDir("目录1-1");
File levelOneTwo = new FileDir("目录1-2");
File levelOneThree = new FileDir("目录1-3");
levelOne.addFile(levelOneOne);
levelOne.addFile(levelOneTwo);
levelOne.addFile(levelOneThree);
File levelFileOneOne = new FileItem("文件1-1");
levelOne.addFile(levelFileOneOne);
File levelFileTwoOne = new FileItem("文件2-1");
File levelFileTwoTwo = new FileItem("文件2-2");
File levelFileTwoThree = new FileItem("文件2-3");
levelTwo.addFile(levelFileTwoOne);
levelTwo.addFile(levelFileTwoTwo);
levelTwo.addFile(levelFileTwoThree);
File levelFileTreeOne = new FileItem("文件3-1");
File levelFileTreeTwo = new FileItem("文件3-2");
File levelFileTreeThree = new FileItem("文件3-3");
levelThree.addFile(levelFileTreeOne);
levelThree.addFile(levelFileTreeTwo);
levelThree.addFile(levelFileTreeThree);
root.listFile("");
}
}
输出结果
其中组合对象前面都含有+,叶子对象前面都含有-,安装顺序排列开来
+根目录
+目录1
+目录1-1
+目录1-2
+目录1-3
-文件1-1
+目录2
-文件2-1
-文件2-2
-文件2-3
+目录3
-文件3-1
-文件3-2
-文件3-3