组合模式
1. 什么是组合模式
Composite 模式也叫组合模式,是构造型的设计模式之一。通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。
2. 组合模式的结构

3. 组合模式的角色与职责
Component(树形结构的节点抽象)
- 为所有的对象定义统一的接口(公共属性,行为等的定义)
- 提供管理子节点对象的接口方法
- 【可选】提供管理父节点对象的接口方法
Leaf(树形结构的叶节点)
- Component 的实现子类
Composite(树形结构的枝节点)
- Component 的实现子类
4. 代码演示
public interface IFile {void display();boolean add(IFile file);boolean remove(IFile file);List<IFile> getChild();}
public class File implements IFile {private final String name;public File(String name) {this.name = name;}@Overridepublic void display() {System.out.println(name);}@Overridepublic boolean add(IFile file) {return false;}@Overridepublic boolean remove(IFile file) {return false;}@Overridepublic List<IFile> getChild() {return null;}}
public class Folder implements IFile {private final String name;private final List<IFile> children;public Folder(String name) {this.name = name;this.children = new ArrayList<>();}@Overridepublic void display() {System.out.println(name);}@Overridepublic boolean add(IFile file) {return this.children.add(file);}@Overridepublic boolean remove(IFile file) {return this.children.remove(file);}@Overridepublic List<IFile> getChild() {return children;}}
public class Util {public static void displayTree(IFile iFile, int deep) {for (int i = 0; i < deep; i++) {System.out.print("--");}iFile.display();List<IFile> children = iFile.getChild();for (IFile file : children) {if (file instanceof File) {for (int i = 0; i <= deep; i++) {System.out.print("--");}file.display();} else {displayTree(file, deep + 1);}}}}
IFile rootFolder = new Folder("C:");IFile beiFengFolder = new Folder("beifeng");IFile beiFengFile = new File("beifeng.txt");rootFolder.add(beiFengFolder);rootFolder.add(beiFengFile);IFile iBeifengFolder = new Folder("ibeifeng");IFile iBeifengFile = new File("ibeifeng.txt");beiFengFolder.add(iBeifengFolder);beiFengFolder.add(iBeifengFile);IFile iiBeifengFolder = new Folder("iibeifeng");IFile iiBeifengFile = new File("iibeifeng.txt");iBeifengFolder.add(iiBeifengFolder);iBeifengFolder.add(iiBeifengFile);Util.displayTree(rootFolder, 0);
C:--beifeng----ibeifeng------iibeifeng------iibeifeng.txt----ibeifeng.txt--beifeng.txt
