一、组合模式
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;}@Overridepublic boolean addElement(FileSystemElement element) {if (this.elementList==null){this.elementList = new ArrayList<>();}this.elementList.add(element);return true;}@Overridepublic boolean removeElement(FileSystemElement element) {if (!CollectionUtils.isEmpty(elementList)) {for (FileSystemElement systemElement : elementList) {if (element.getName().equals(systemElement.getName())) {elementList.remove(systemElement);break;}}}return true;}@Overridepublic 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;}@Overridepublic boolean addElement(FileSystemElement element) {System.out.println("当前节点为文件,不能创建节点");return false;}@Overridepublic boolean removeElement(FileSystemElement element) {System.out.println("当前节点为文件,不能删除节点");return false;}@Overridepublic 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(); // 展示根节点的文件系统信息}
运行结果:
可以看到当完整的构建了组合模式的时候,能够根据其中的一个节点获取到相关子节点的信息。
总结:
本例仅展示了一个子节点的信息,如果需要定义兄弟节点等多个维度的信息,则需要定义多个属性实例及对应的增删方法。
学海无涯苦作舟!!!