一、组合模式的定义(是什么)?
将对象以树状结构组织起来,并使单个对象和组合对象具有一致性。
抽象构件(component) :使单个对象和组合对象具有一致性
单个对象(leaf):不可再细分
组合对象(composite):内部包含单个对象或者组合对象
二、组合模式的作用(为什么)?
将对象组织成树状结构,单个对象和组合对象形成一致性,从而形成天然的递归。
三、组合模式的实现(怎么办)?
创建抽象构件,将单个对象共性提取出来(这里仅仅指安全组合模式)
创建单个对象,继承抽象构件,实现构件的方法
创建组合对象,继承抽象构件,实现构件的方法,并且包含构件对象集合
如文件目录输出名字:
/** * 文件(抽象构件) */ public abstract class AbstractFile { private String name;//文件名 public abstract String displayName();//展示文件名 } /** * 文本文件(单个对象) */ public class TextFile extends AbstractFile { private String name; public TextFile(String name){ this.name = name; } @Override public String displayName() { return name+" "; } } /** * 图片文件(单个对象) */ public class ImgFile extends AbstractFile { private String name; public ImgFile(String name){ this.name = name; } @Override public String displayName() { return name+" "; } } /** * 文件夹(组合对象) */ public class Folder extends AbstractFile{ private String name; private List<AbstractFile> list; public Folder(String name){ this.name = name; list = new ArrayList<AbstractFile>(); } //添加文件 public void addFile(AbstractFile abstractFile){ list.add(abstractFile); } //删除文件 public void removeFile(AbstractFile abstractFile){ list.remove(abstractFile); } //获取文件 public AbstractFile getAbstractFile(Integer index){ return list.get(index); } @Override public String displayName() { String name = this.name+"("; for (AbstractFile file:list) { name += file.displayName(); } name += ")"; return name; } } public class MyTest { @Test public void test(){ AbstractFile f1,f2,f3,f4,f5; f1 = new TextFile("文本文件1"); f2 = new TextFile("文本文件2"); f3 = new ImgFile("图片文件2"); f4 = new Folder("文件夹1"); f5 = new Folder("文件夹2"); ((Folder) f4).addFile(f1); ((Folder) f4).addFile(f5); ((Folder) f5).addFile(f2); ((Folder) f5).addFile(f3); //输出文件夹1及内部所有文件名称 System.out.println(f4.displayName()); } }
输出结果为:
四、常用场景
文件目录系统
菜单目录系统
杀毒软件