设计模式:组合模式
组合模式非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(); } }
这里模拟了一个简单的文件扫描工具,先建立文件夹,和一些文件,使用统一的操作接口去操作文件和文件夹,进行扫描操作。