定义 组合模式(Composite Pattern)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以使用一致的方法操作单个对象和组合对象。
组成角色 (1)组合部件(Component):它是一个抽象接口。这里表示树根。 (2)叶子(Leaf):在组合中表示子节点对象,这里表示的是文件,其没有孩子了。 (3)合成部件(Composite):表示自己还有孩子,这里表示的是文件夹。
应用场景 当想表达对象的部分-整体的层次结构时。希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。
优缺点 缺点:客户端需要花更多时间理清类之间的层次关系 优点:无需关系处理的单个对象,还是组合的对象容器,实现容器之间的解耦合。当有新部件时容易添加进来。
图例 代码示例
/** * 文件夹 * @author lu * @since 1.0, 2020年7月4日 */ public abstract class File { String name; public File (String name){ this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void display(); } /** * 文件夹类 - 该类包含对文件的增加,删除和浏览三个方法 * @author lu * @since 1.0, 2020年7月4日 */ public class Folder extends File{ private List<File> files; public Folder(String name) { super(name); files = new ArrayList<File>(); } /** * 浏览文件夹中的文件 */ @Override public void display() { for (File file : files) { file.display(); } } /** * 向文件夹中添加文件 */ public void add(File file){ files.add(file); } /** * 从文件夹中删除文件 */ public void remove(File file){ files.remove(file); } } /** * 文本文件类 * @author lu * @since 1.0, 2020年7月4日 */ public class TextFile extends File{ public TextFile(String name) { super(name); } @Override public void display() { System.out.println("文本文件,文件名:"+super.getName()); } } /** * 图像文件 * @author lu * @since 1.0, 2020年7月4日 */ public class ImageFile extends File{ public ImageFile(String name) { super(name); } public void display(){ System.out.println("图像文件,文件名"+super.getName()); } } /** * 影像文件 * @author lu * @since 1.0, 2020年7月4日 */ public class VideoFile extends File{ public VideoFile(String name) { super(name); } @Override public void display() { System.out.println("影像文件,文件名:"+super.getName()); } } /** * 客户端测试 * @author lu * @since 1.0, 2020年7月4日 */ public class Client { public static void main(String[] args) { /** * 建立文件系统 * 总文件 * a.txt b.jpg c文件夹 * c_1.text c_1.rmvb c_1.jpg */ //1、总文件夹 Folder zwjj = new Folder("总文件夹"); //2、向总文件夹里放入三个文件: a.txt b.jpg c文件夹 TextFile aText = new TextFile("a.text"); ImageFile bImage = new ImageFile("b.jpg"); Folder cFolder = new Folder("c文件夹"); zwjj.add(aText); zwjj.add(bImage); zwjj.add(cFolder); //3、向c文件夹中添加文件:c_1.text c_1.rmvb c_1.jpg TextFile c_1Text = new TextFile("c_1.text"); VideoFile c_1Video = new VideoFile("c_1.rmvb"); ImageFile c_1Image = new ImageFile("c_1.jpg"); cFolder.add(c_1Text); cFolder.add(c_1Video); cFolder.add(c_1Image); System.out.println("-----删除前C文件夹里的文件-----"); //遍历c文件夹 cFolder.display(); //将c_1.txt删除 cFolder.remove(c_1Text); System.out.println("-----删除后C文件夹里的文件-----"); cFolder.display(); } }运行结果