核心思想
组合模式可以使用一棵树来表示 组合模式使得用户可以使用一致的方法操作单个对象和组合对象 组合模式又叫部分整体模式,将对象组合成树形结构以表示“部分-整体”的层次结构,可以更好的实现管理操作,部分-整体对象的操作基本一样,但是应该还会有不一样的地方
场景使用
比如文件夹和文件,都有增加、删除等api,也有层级管理关系 比如公司,总公司下有子公司,每个公司的部门都类似
优缺点
优点
方便创建出复杂的层次结构 客户端只需要面对一致的对象而不用考虑整体部分的问题
缺点
代码示例
根节点(抽象类-Component)
public abstract class Root { private String name; public Root ( String name) { this . name = name; } public String getName ( ) { return name; } public void setName ( String name) { this . name = name; } public abstract void addFile ( Root root) ; public abstract void removeFile ( Root root) ; public abstract void display ( int depth) ; }
具体文件夹类(Composite)
public class Folder extends Root { private List < Root > folders = new ArrayList < > ( ) ; public Folder ( String name) { super ( name) ; } public List < Root > getFolders ( ) { return folders; } public void setFolders ( List < Root > folders) { this . folders = folders; } @Override public void addFile ( Root root) { folders. add ( root) ; } @Override public void removeFile ( Root root) { folders. remove ( root) ; } @Override public void display ( int depth) { StringBuilder sb = new StringBuilder ( ) ; for ( int i = 0 ; i < depth; i++ ) { sb. append ( "-" ) ; } System . out. println ( sb. toString ( ) + this . getName ( ) ) ; for ( Root r : folders) { r. display ( depth + 1 ) ; } }
}
具体的文件(Leaf)
public class File extends Root { public File ( String name) { super ( name) ; } @Override public void addFile ( Root root) { } @Override public void removeFile ( Root root) { } @Override public void display ( int depth) { StringBuilder sb = new StringBuilder ( ) ; for ( int i = 0 ; i < depth; i++ ) { sb. append ( "-" ) ; } System . out. println ( sb. toString ( ) + this . getName ( ) ) ; }
}
测试
public class AppRun { public static void main ( String [ ] args) { Root root1 = new Folder ( "root" ) ; Root comp1 = new Folder ( "Composite1" ) ; Root comp2 = new Folder ( "Composite2" ) ; root1. addFile ( comp1) ; root1. addFile ( comp2) ; comp1. addFile ( new File ( "leafA" ) ) ; comp2. addFile ( new File ( "leafB" ) ) ; root1. display ( 1 ) ; }
}