2023-04-01  阅读(2)
原文作者:LoveLion 原文地址:https://blog.csdn.net/lovelion/article/details/7956898

11.3 完整解决方案

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

202304012102164881.png

图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'进行杀毒

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


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文