11.3  完整解决方案

为了让系统具有更好的灵活性和可扩展性,客户端可以一致地对待文件和文件夹,Sunny公司开发人员使用组合模式来进行杀毒软件的框架设计,其基本结构如图11-5所示:

图11-5  杀毒软件框架设计结构图

在图11-5中, AbstractFile充当抽象构件类,Folder充当容器构件类,ImageFile、TextFile和VideoFile充当叶子构件类。完整代码如下所示:

import java.util.*;
//抽象文件类:抽象构件
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();
}
//图像文件类:叶子构件
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 + "'进行杀毒");
}
}
//文本文件类:叶子构件
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 + "'进行杀毒");
}
}
//视频文件类:叶子构件
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 + "'进行杀毒");
}
}
//文件夹类:容器构件
class Folder extends AbstractFile {
//定义集合fileList,用于存储AbstractFile类型的成员
private ArrayList<AbstractFile> fileList=new ArrayList<AbstractFile>();
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 + "'进行杀毒");  //模拟杀毒
//递归调用成员构件的killVirus()方法
for(Object obj : fileList) {
((AbstractFile)obj).killVirus();
}
}
}

编写如下客户端测试代码:

class Client {
public static void main(String args[]) {
//针对抽象构件编程
AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4;
folder1 = new Folder("Sunny的资料");
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);
//从“Sunny的资料”节点开始进行杀毒操作
folder1.killVirus();
}
}

编译并运行程序,输出结果如下:

****对文件夹'Sunny的资料'进行杀毒

****对文件夹'图像文件'进行杀毒

----对图像文件'小龙女.jpg'进行杀毒

----对图像文件'张无忌.gif'进行杀毒

****对文件夹'文本文件'进行杀毒

----对文本文件'九阴真经.txt'进行杀毒

----对文本文件'葵花宝典.doc'进行杀毒

****对文件夹'视频文件'进行杀毒

----对视频文件'笑傲江湖.rmvb'进行杀毒

由于在本实例中使用了组合模式,在抽象构件类中声明了所有方法,包括用于管理和访问子构件的方法,如add()方法和remove()方法等,因此在ImageFile等叶子构件类中实现这些方法时必须进行相应的异常处理或错误提示。在容器构件类Folder的killVirus()方法中将递归调用其成员对象的killVirus()方法,从而实现对整个树形结构的遍历。

如果需要更换操作节点,例如只需对文件夹“文本文件”进行杀毒,客户端代码只需修改一行即可,将代码:

folder1.killVirus();

改为:

folder3.killVirus();

输出结果如下:

****对文件夹'文本文件'进行杀毒

----对文本文件'九阴真经.txt'进行杀毒

----对文本文件'葵花宝典.doc'进行杀毒

在具体实现时,我们可以创建图形化界面让用户选择所需操作的根节点,无须修改源代码,符合“开闭原则”,客户端无须关心节点的层次结构,可以对所选节点进行统一处理,提高系统的灵活性。

【作者:刘伟  http://blog.csdn.net/lovelion】

树形结构的处理——组合模式(三)相关推荐

  1. 树形结构的处理——组合模式(五)

    11.5 公司组织结构 在学习和使用组合模式时,Sunny软件公司开发人员发现树形结构其实随处可见,例如Sunny公司的组织结构就是"一棵标准的树",如图11-8所示: 图11-8 ...

  2. 树形结构的处理——组合模式(二)

    11.2 组合模式概述 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象)并调用执行,牵一而动百,其中使用了 ...

  3. 树形结构的处理——组合模式(四)

    11.4  透明组合模式与安全组合模式 通过引入组合模式,Sunny公司设计的杀毒软件具有良好的可扩展性,在增加新的文件类型时,无须修改现有类库代码,只需增加一个新的文件类作为AbstractFile ...

  4. 组合模式 -- 树形结构处理

    树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得 ...

  5. java设计模式之组合模式(树形层级)

    java设计模式之组合模式 学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来 ...

  6. 【学习设计模式11】树形处理——组合模式

    上篇: [学习设计模式10]分离抽象与实现--桥接模式_Aiky哇的博客-CSDN博客上篇:[学习设计模式9]兼容扩展坞-适配器模式_Aiky哇的博客-CSDN博客上篇:[学习设计模式8]组装流水线- ...

  7. 1、【设计模式】组合模式

    java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...

  8. 设计模式之禅之设计模式-组合模式

    一:组合模式的定义         --->组合模式(Composite Pattern)也叫合成模式,有时又叫做部分-整体模式(Part-Whole),主要是用来描述部分与整体的关系      ...

  9. 设计模式之禅【组合模式】

    真刀实枪之组合模式 从公司的人事架构谈起吧 公司的组织架构 从上图中可以分析出: 有分支的节点(树枝节点) 无分支的节点(叶子节点) 根节点(无父节点) 有了树状结构图,再看看类图长啥样吧! 这个类图 ...

最新文章

  1. 查看Hotspot源码,查看java各个版本源码的网站,如何查看jdk源码
  2. thinkpad触控笔怎么用_笔记本电脑卡死了怎么办关不了机
  3. Microsoft office Communications server 2007部署
  4. Python 技术篇-使用PyQt5库获取电脑屏幕桌面的宽、高和分辨率
  5. 初次尝试使用IDAPro修改程序控制流程
  6. C# SharpMap 学习总结
  7. calendar获取本周一的日期_Java Calendar 获取本周周一和周日代码
  8. 基于java的络教学平台的设计与实现 (含源文件)
  9. Android 内存泄漏分析指北
  10. 通过python连接mysql模拟成绩查询系统
  11. iOS 各种坐标系对比
  12. java 常见关键字的使用
  13. 阿里云短信SDK使用
  14. BTP-2118 玩 GTA5
  15. 网络安全----身份认证
  16. html5 边框效果图,图片边框border-image的用法
  17. ORB-SLAM2详解(一)文献导读
  18. 鸿蒙系统官网电脑版,华为鸿蒙pc系统
  19. 吃鸡账号显示连接不了服务器,《绝地求生》“与Steam服务器连接时出现了一个问题”怎么解决...
  20. OpenCV 保存视频

热门文章

  1. 数据结构顺序表和单链表优缺点
  2. 《Python网络爬虫从入门到实践 第2版》第14章 爬虫实践一:维基百科
  3. 计算机夏令营英语怎么说,夏令营用英语怎么说?
  4. 立足西安,昇腾AI为开发者留下了脚印一串
  5. C# wave mp3 播放器探寻
  6. 面向萌新的红帽杯2018线上赛wp
  7. 帮我写一段能实时获取经纬度和具体地区的python代码
  8. 一个asp.net OOM问题
  9. 图漾相机-TM461-E2(TM460-E2) TOF相机
  10. 放假倒计时弹幕单页网站源码