组合模式--也称为部分整体模式,它将一组相似的对象看作一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与集合之间的差别。
郭神的http://blog.csdn.net/guolin_blog/article/details/9153753
定义:将对象组合成树形结构以表示 部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
使用场景: 1表示对象的部分-整体层次结构时。
2从一个整体中能够独立出部分模块或功能的场景
例子: 公司
行政部 研发部 公司
行政部 研发部
或者 文件
文件夹 文件
例子代码:
public abstract class Dir { /** * 声明一个List存储文件夹下所有元素 */ protected List<Dir> dirs=new ArrayList<>(); private String name;//当前文件或文件夹名 public Dir(String name){ this.name=name; } /** * 添加一个文件或文件夹 * @param dir */ abstract void addDir(Dir dir); /** * 删除一个文件或文件夹 * @param dir */ abstract void removeDir(Dir dir); /** * 清空文件夹下所有元素 */ abstract void clear(); /** * 获取文件夹下所有的文件或子文件夹 */ abstract List<Dir> getFiles(); /** * 输出文件夹目录结构 */ abstract void print(); /** * 获取文件或文件夹名 */ public String getName(){ return name; } }
public class File extends Dir { public File(String name) { super(name); } @Override void addDir(Dir dir) { throw new UnsupportedOperationException("文件对象不支持改操作"); } @Override void removeDir(Dir dir) { throw new UnsupportedOperationException("文件对象不支持改操作"); } @Override void clear() { throw new UnsupportedOperationException("文件对象不支持改操作"); } @Override List<Dir> getFiles() { throw new UnsupportedOperationException("文件对象不支持改操作"); } @Override void print() { System.out.println(getName()); } }
public class Folder extends Dir { public Folder(String name) { super(name); } @Override void addDir(Dir dir) { dirs.add(dir); } @Override void removeDir(Dir dir) { dirs.remove(dir); } @Override void clear() { dirs.clear(); } @Override List<Dir> getFiles() { return dirs; } @Override void print() { System.out.println(getName() + "("); Iterator<Dir> iterator = dirs.iterator(); while (iterator.hasNext()){ Dir dir = iterator.next(); dir.print(); if (iterator.hasNext()) System.out.println(","); } System.out.println(")"); } }
public class Client { public void main(String args[]){ // Dir diskC=new Folder("c"); diskC.addDir(new File("ImageYanbin.png")); //c盘下有个子目录 Dir dirWin=new Folder("window"); dirWin.addDir(new File("window.exe")); diskC.addDir(dirWin); //打印出文件结构 diskC.print(); } }
一个典型的树状嵌套模式,就是组合模式
andorid源码中: View 和ViewGroup的嵌套组合,
p367 安全的设计模式
总结
组合模式时通过继承实现的,这样的做法牺牲了类的单一原则,缺少弹性。
优点:可以清楚的定义分层次的复杂对象, 表示对象的全部或部分层次,它让高层模块忽略了层次的差异,方便对整个层次结构进行控制
高层模块可以一致地使用一个组合结构或其中的单个对象,不必关心处理的是单个对象还是组合结构,简化了高层模块的代码。
组合结构为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和枝干对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。
缺点:
在新增构件时不好对枝干中的构件类型进行限制,不能依赖类型系统来施加这些约束,因为在大多数情况下,他们都来自于相同的抽象层,此时,可以使用类型检查来实现,此实现过程较复杂。