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

图11-5 杀毒软件框架设计结构图java
在图11-5中, AbstractFile充当抽象构件类,Folder充当容器构件类,ImageFile、TextFile和VideoFile充当叶子构件类。完整代码以下所示:编程
-
-
-
-
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 {
-
-
-
public ImageFile(String 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(
"对不起,不支持该方法!");
-
-
-
-
public void killVirus() {
-
-
System.out.println(
"----对图像文件'" + name + "'进行杀毒");
-
-
-
-
-
class TextFile extends AbstractFile {
-
-
-
public TextFile(String 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(
"对不起,不支持该方法!");
-
-
-
-
public void killVirus() {
-
-
System.out.println(
"----对文本文件'" + name + "'进行杀毒");
-
-
-
-
-
class VideoFile extends AbstractFile {
-
-
-
public VideoFile(String 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(
"对不起,不支持该方法!");
-
-
-
-
public void killVirus() {
-
-
System.out.println(
"----对视频文件'" + name + "'进行杀毒");
-
-
-
-
-
class Folder extends AbstractFile {
-
-
private ArrayList<AbstractFile> fileList=new ArrayList<AbstractFile>();
-
-
-
public Folder(String name) {
-
-
-
-
public void add(AbstractFile file) {
-
-
-
-
public void remove(AbstractFile 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();
-
-
-
编写以下客户端测试代码:
-
-
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");
-
-
-
-
-
-
-
-
-
-
-
-
-
-
编译并运行程序,输出结果以下:框架
****对文件夹'Sunny的资料'进行杀毒ide ****对文件夹'图像文件'进行杀毒post ----对图像文件'小龙女.jpg'进行杀毒测试 ----对图像文件'张无忌.gif'进行杀毒flex ****对文件夹'文本文件'进行杀毒this ----对文本文件'九阴真经.txt'进行杀毒spa ----对文本文件'葵花宝典.doc'进行杀毒 ****对文件夹'视频文件'进行杀毒 ----对视频文件'笑傲江湖.rmvb'进行杀毒 |
因为在本实例中使用了组合模式,在抽象构件类中声明了全部方法,包括用于管理和访问子构件的方法,如add()方法和remove()方法等,所以在ImageFile等叶子构件类中实现这些方法时必须进行相应的异常处理或错误提示。在容器构件类Folder的killVirus()方法中将递归调用其成员对象的killVirus()方法,从而实现对整个树形结构的遍历。
若是须要更换操做节点,例如只需对文件夹“文本文件”进行杀毒,客户端代码只需修改一行便可,将代码:
改成:
输出结果以下:
****对文件夹'文本文件'进行杀毒 ----对文本文件'九阴真经.txt'进行杀毒 ----对文本文件'葵花宝典.doc'进行杀毒 |
在具体实现时,咱们能够建立图形化界面让用户选择所需操做的根节点,无须修改源代码,符合“开闭原则”,客户端无须关心节点的层次结构,能够对所选节点进行统一处理,提升系统的灵活性。
【做者:刘伟 http://blog.csdn.net/lovelion】