本文共 4296 字,大约阅读时间需要 14 分钟。
组合模式 用面向对象的方式来处理树形结构 组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。 在组合模式中引入了抽象构件类Component,它是所有容器类和叶子类的公共父类。 角色 Component抽象构件 可以是接口或抽象类 为叶子构件和容器构件对象声明接口 Leaf叶子构件 叶子节点没有子节点 Composite容器构件 容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点。
杀毒软件案例
1.抽象文件类
package Composite;/** * Created by Jiqing on 2016/10/5. */abstract class AbstractFile { public abstract void add(AbstractFile file); public abstract void remove(AbstractFile file); public abstract AbstractFile getChild(int i); public abstract void killVirus();}
2.Image文件类
package Composite;/** * Created by Jiqing on 2016/10/5. */public class ImageFile extends AbstractFile{ private String name; public ImageFile (String name) { this.name = name; } public void add(AbstractFile file) { System.out.println("对不起,不支持该方法!"); } public void remove(AbstractFile file) { System.out.println("对不起,不支持该方法!"); } public AbstractFile getChild(int i) { System.out.println("对不起,不支持该方法!"); return null; } public void killVirus() { // 模拟杀毒 System.out.println("----对图像文件'" + name + "'进行杀毒----"); }}
3.文本文件类
package Composite;/** * Created by Jiqing on 2016/10/5. */public class TextFile extends AbstractFile{ private String name; public TextFile (String name) { this.name = name; } public void add(AbstractFile file) { System.out.println("对不起,不支持该方法!"); } public void remove(AbstractFile file) { System.out.println("对不起,不支持该方法!"); } public AbstractFile getChild(int i) { System.out.println("对不起,不支持该方法!"); return null; } public void killVirus() { // 模拟杀毒 System.out.println("----对文本文件'" + name + "'进行杀毒----"); }}
4.视频文件类
package Composite;/** * Created by Jiqing on 2016/10/5. */public class VideoFile extends AbstractFile{ private String name; public VideoFile (String name) { this.name = name; } public void add(AbstractFile file) { System.out.println("对不起,不支持该方法!"); } public void remove(AbstractFile file) { System.out.println("对不起,不支持该方法!"); } public AbstractFile getChild(int i) { System.out.println("对不起,不支持该方法!"); return null; } public void killVirus() { // 模拟杀毒 System.out.println("----对视频文件'" + name + "'进行杀毒----"); }}
5.文件夹类
package Composite;import java.util.ArrayList;/** * Created by Jiqing on 2016/10/5. */public class Folder extends AbstractFile{ private ArrayListfileList = new ArrayList (); // 规定集合中成员类型 private String name; public Folder(String name) { this.name = name; } public void add(AbstractFile file) { fileList.add(file); } public void remove(AbstractFile file) { fileList.remove(file); } public AbstractFile getChild(int i) { return (AbstractFile)fileList.get(i); // 强制转换为类型 } public void killVirus() { System.out.println("****对文件夹'" + name + "'进行杀毒****"); // 模拟杀毒 // 递归调用成员构件的杀毒方法 for (Object obj :fileList) { ((AbstractFile)obj).killVirus(); } }}
6.客户端
package Composite;/** * Created by Jiqing on 2016/10/5. */public class Client { public static void main(String args[]) { AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4; folder1 = new Folder("Jim的资料"); folder2 = new Folder("图像文件"); folder3 = new Folder("文本文件"); folder4 = new Folder("视频文件"); file1 = new ImageFile("小龙女.jpg"); file2 = new ImageFile("张无忌.gif"); file3 = new TextFile("九阴真经.txt"); file4 = new TextFile("葵花宝典.doc"); file5 = new VideoFile("笑傲江湖.rmvb"); folder2.add(file1); folder2.add(file2); folder3.add(file3); folder3.add(file4); folder4.add(file5); folder1.add(folder2); folder1.add(folder3); folder1.add(folder4); folder1.killVirus(); }}
执行结果
****对文件夹'Jim的资料'进行杀毒****
****对文件夹'图像文件'进行杀毒**** ----对图像文件'小龙女.jpg'进行杀毒---- ----对图像文件'张无忌.gif'进行杀毒---- ****对文件夹'文本文件'进行杀毒**** ----对文本文件'九阴真经.txt'进行杀毒---- ----对文本文件'葵花宝典.doc'进行杀毒---- ****对文件夹'视频文件'进行杀毒**** ----对视频文件'笑傲江湖.rmvb'进行杀毒----本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/5932974.html,如需转载请自行联系原作者