一、组合模式
1、组合模式
组合模式(Composite Pattern)是这一种结构型设计模式。又叫部分整体模式。组合模式依据树形结构来组合对象,用来表示部分以及整体层次关系。即:创建了一个包含自己对象组的类,该类提供了修改相同对象组的方式。
2、示例场景
(1)、公司管理管理关系。如,总经理直接下级包含多个总监,每个总监下包含多个负责人,每个负责人下包含多个具体员工
(2)、其他一些树形结构使用的场景。
3、实现思路
(1)、实体类中,定义包含自身对象或者自身对象集合的属性。
(2)、定义添加和删除自身集合属性方法。
(3)、定义展示或操作自身及孩子节点的具体业务方法。
二、代码示例
1、代码示例
// 定义文件系统抽象类规范
import lombok.Data;
import java.util.List;
@Data
public abstract class FileSystemElement {
protected String name;
protected List<FileSystemElement> elementList;
public abstract boolean addElement(FileSystemElement element);
public abstract boolean removeElement(FileSystemElement element);
public abstract void showElement();
}
// 定义文件夹实现类
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
public class FolderElement extends FileSystemElement {
public FolderElement(String name) {
this.name = name;
}
@Override
public boolean addElement(FileSystemElement element) {
if (this.elementList==null){
this.elementList = new ArrayList<>();
}
this.elementList.add(element);
return true;
}
@Override
public boolean removeElement(FileSystemElement element) {
if (!CollectionUtils.isEmpty(elementList)) {
for (FileSystemElement systemElement : elementList) {
if (element.getName().equals(systemElement.getName())) {
elementList.remove(systemElement);
break;
}
}
}
return true;
}
@Override
public void showElement() {
System.out.println("目录名称:" + name+",包含内容如下:");
if (!CollectionUtils.isEmpty(elementList)) {
for (FileSystemElement systemElement : elementList) {
systemElement.showElement();
}
}
System.out.println("目录名称:" + name+",包含如上" );
}
}
// 定义文件实现类
public class FileElement extends FileSystemElement {
public FileElement(String name) {
this.name = name;
}
@Override
public boolean addElement(FileSystemElement element) {
System.out.println("当前节点为文件,不能创建节点");
return false;
}
@Override
public boolean removeElement(FileSystemElement element) {
System.out.println("当前节点为文件,不能删除节点");
return false;
}
@Override
public void showElement() {
System.out.println("文件名称:" + name);
}
}
// 测试
public static void main(String[] args) {
FileSystemElement rootDir = new FolderElement("根目录");
FileSystemElement dir1 = new FolderElement("目录1");
FileSystemElement dir2 = new FolderElement("目录2");
FileSystemElement dir3 = new FolderElement("目录3");
FileSystemElement file1 = new FileElement("文件1");
FileSystemElement file2 = new FileElement("文件2");
FileSystemElement file3 = new FileElement("文件3");
rootDir.addElement(dir1);
rootDir.addElement(dir2);
dir1.addElement(dir3);
dir1.addElement(file1);
dir2.addElement(file2);
dir3.addElement(file3);
rootDir.showElement(); // 展示根节点的文件系统信息
}
运行结果:
可以看到当完整的构建了组合模式的时候,能够根据其中的一个节点获取到相关子节点的信息。
总结:
本例仅展示了一个子节点的信息,如果需要定义兄弟节点等多个维度的信息,则需要定义多个属性实例及对应的增删方法。
学海无涯苦作舟!!!