设计模式-组合模式(Composite)
组合模式是构造型模式的一种。通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树
角色和职责:
就是文件夹那种形式,树形
UML图:
具体代码:
import java.util.List; /** * Ifile 统一接口 */ public interface Ifile { void display();//显示 boolean add(Ifile file);//添加 boolean remove(Ifile file);//删除 List<Ifile> getChild();//获取孩子节点 }
import java.util.List; /** * 文件 */ public class File implements Ifile{ private String fileName;//文件名 public File(String fileName){ this.fileName = fileName; } @Override public void display() { System.out.println(fileName); } @Override public boolean add(Ifile file) { return false; } @Override public boolean remove(Ifile file) { return false; } @Override public List<Ifile> getChild() { return null; } }
import java.util.ArrayList; import java.util.List; /** * 目录 */ public class Folder implements Ifile{ private String fileName;//文件名 private List<Ifile> list = null;//目录集合 public Folder(String fileName){ this.fileName = fileName; this.list = new ArrayList<Ifile>(); } @Override public void display() { System.out.println(fileName); } @Override public boolean add(Ifile file) { this.list.add(file); return true; } @Override public boolean remove(Ifile file) { this.list.add(file); return true; } @Override public List<Ifile> getChild() { return this.list; } }
import java.util.List; public class Main { public static void main(String[] args) { Ifile folder_d = new Folder("d:"); Ifile file_d_aa = new File("aa.txt"); Ifile folder_d_dingding = new Folder("dingding"); Ifile folder_d_dingding_bin = new Folder("bin"); Ifile file_d_dingding_b = new File("可执行文件.exe"); Ifile file_d_dingding_bin_b = new File("mm.exe"); Ifile file_d_bb = new File("bb.txt"); folder_d_dingding_bin.add(file_d_dingding_bin_b); folder_d_dingding.add(folder_d_dingding_bin); folder_d_dingding.add(file_d_dingding_b); folder_d.add(file_d_aa); folder_d.add(folder_d_dingding); folder_d.add(file_d_bb); show(folder_d,0);//显示当前目录下的节点 } /** * 显示当前目录下的节点 * @param file */ public static void show(Ifile file,int deep){ for(int m=0;m<deep;m++){ System.out.print("--"); } List<Ifile> list = file.getChild(); for(int i = 0; i<list.size();i++){ Ifile fi = list.get(i); System.out.print("--"); if(fi instanceof File){ for(int n=0;n<deep-1;n++){ System.out.print("--"); } fi.display(); }else{ fi.display(); show(fi,++deep); } } } }
结果:
--aa.txt
--dingding
----bin
--------mm.exe
----可执行文件.exe
--bb.txt
优缺点:
优:
- 可以清楚地定义分层次的复杂类型,表示对象的全部层次或者部分层次 ,它让客户端忽略了层次的差异,方便对整个层次经行控制
- 客户端可以一致的使用一个组合模式或对单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端的代码
- 在组合模式种增加新的容器构件和叶子构件都很方便,无需对现有类库进行任何修改,符合开闭原则。
- 为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合可以形成复杂的树形机构,但对树形结构的控制却很简单
应用场景:
在一个使用面向对象语言开发的系统中需要处理一个树形结构的
在一个系统中能分离出叶子和容器的,而且他们的类型还固定不变,需要增加一些新的类型
源码地址:https://github.com/qjm201000/design_pattern_composite.git