组合模式非java核心中的组合。
组合模式的定义:把部分和整体关系用“树形结构”来表示。从而使客户端可用同一方式处理部分对象或整体对象。
树形结构例子:比如平时的配置文件xml, 文件系统等
核心:
抽象角色:定义了叶子和容器构件的共同点。如文件系统中文件和文件夹的特性。
叶子构建角色(树的叶子):无子节点。如文件系统中的文件。
容器构建角色:如文件系统中的文件夹。
组合模式使用户在使用时通过抽象角色一致处理容器和叶子。
当容器对象指定方法被调用时,将遍历整个树形结构。寻找包含这个方法的成员并调用执行。
例子:
/**
* 模拟杀毒软件
* <p>
* 抽象组件,
*/
public interface AbstraceFile {
void scanVirus();
}
/**
* 叶子组件
* <p>
* 文件。
*/
class TextFile implements AbstraceFile {
private String name;
public TextFile(String name) {
this.name = name;
}
@Override
public void scanVirus() {
System.out.println("完成文本文件" + name + "扫描");
}
}
/**
* 容器组件
* <p>
* 文件夹
*/
class Folder implements AbstraceFile {
private String name;
private List<AbstraceFile> fileList;
public Folder(String name) {
this.name = name;
fileList = new ArrayList<>();
}
/**
* 这里包含一个天然递归方法
*/
@Override
public void scanVirus() {
System.out.println("扫描文件夹");
for (AbstraceFile file : fileList) {
file.scanVirus();
}
}
/**
* 容器新增方法
*
* @param file
*/
public void add(AbstraceFile file) {
fileList.add(file);
}
/**
* 容器新增方法
*
* @param file
*/
public void remove(AbstraceFile file) {
fileList.remove(file);
}
}
public class Client {
public static void main(String[] args) {
Folder file1 = new Folder("文件夹1");
AbstraceFile file2 = new TextFile("文本文件1");
// file2.scanVirus();
file1.add(file2);
//统一处理方式
file1.scanVirus();
}
}
这里模拟了一个简单的文件扫描工具,先建立文件夹,和一些文件,使用统一的操作接口去操作文件和文件夹,进行扫描操作。