设计模式练习(8)——组合模式
·
组合模式
一、题目:
使用组合模式,设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹Folder杀毒,也可以对某个指定的文件杀毒,文件种类包括,文本文档TextFile,图片文件ImageFile,视频文件VideoFile,绘制类图并编程模拟实现。
(1)绘制组合模式结构视图
(2)给出实例类图并实现代码。
二、所用模式结构视图:
三、实例类图:
四、实例实现代码:
(因为区分,所以在类的前面加了Gj19)
抽象文件类:抽象构件
package CompositePattern;
/**
* 抽象文件类:抽象构件
* @author gong
*
*/
abstract class Gj19AbstractFile {
public abstract void add(Gj19AbstractFile file);
public abstract void remove(Gj19AbstractFile file);
public abstract Gj19AbstractFile getChild(int i);
public abstract void killVirus();
}
图像文件类:叶子构件
package CompositePattern;
/**
* 图像文件类:叶子构件
* @author gong
*
*/
public class Gj19ImageFile extends Gj19AbstractFile{
private String name;
public Gj19ImageFile(String name) {
this.name = name;
}
@Override
public void add(Gj19AbstractFile file) {
System.out.println("错误,不支持该方法!");
}
@Override
public void remove(Gj19AbstractFile file) {
System.out.println("错误,不支持该方法!");
}
public Gj19ImageFile getChild(int i) {
System.out.println("错误,不支持该方法!");
return null;
}
public void killVirus() {
//模拟杀毒
System.out.println("----对图像文件'" + name + "'进行杀毒");
}
}
文本文件类:叶子构件
package CompositePattern;
/**
* 文本文件类:叶子构件
* @author gong
*
*/
public class Gj19TextFile extends Gj19AbstractFile{
private String name;
public Gj19TextFile(String name) {
this.name = name;
}
@Override
public void add(Gj19AbstractFile file) {
System.out.println("错误,不支持该方法!");
}
@Override
public void remove(Gj19AbstractFile file) {
System.out.println("错误,不支持该方法!");
}
public Gj19TextFile getChild(int i) {
System.out.println("错误,不支持该方法!");
return null;
}
public void killVirus() {
//模拟杀毒
System.out.println("----对文本文件'" + name + "'进行杀毒");
}
}
视频文件类:叶子构件
package CompositePattern;
/**
* 视频文件类:叶子构件
* @author gong
*
*/
public class Gj19VideoFile extends Gj19AbstractFile{
private String name;
public Gj19VideoFile(String name) {
this.name = name;
}
@Override
public void add(Gj19AbstractFile file) {
System.out.println("错误,不支持该方法!");
}
@Override
public void remove(Gj19AbstractFile file) {
System.out.println("错误,不支持该方法!");
}
public Gj19VideoFile getChild(int i) {
System.out.println("错误,不支持该方法!");
return null;
}
public void killVirus() {
//模拟杀毒
System.out.println("----对视频文件'" + name + "'进行杀毒");
}
}
文件夹类:容器构件
package CompositePattern;
import java.util.ArrayList;
/**
* 文件夹类:容器构件
* @author gong
*
*/
public class Gj19Folder extends Gj19AbstractFile{
//定义集合fileList,用于存储AbstractFile类型的成员
private ArrayList<Gj19AbstractFile> fileList=new ArrayList<Gj19AbstractFile>();
private String name;
public Gj19Folder(String name) {
this.name = name;
}
public void add(Gj19AbstractFile file) {
fileList.add(file);
}
public void remove(Gj19AbstractFile file) {
fileList.remove(file);
}
public Gj19AbstractFile getChild(int i) {
return (Gj19AbstractFile)fileList.get(i);
}
public void killVirus() {
System.out.println("****对文件夹'" + name + "'进行杀毒"); //模拟杀毒
//递归调用成员构件的killVirus()方法
for(Object obj : fileList) {
((Gj19AbstractFile)obj).killVirus();
}
}
}
客户端测试类
package CompositePattern;
public class Gj19Client {
public static void main(String args[]) {
//针对抽象构件编程
Gj19AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4;
folder1 = new Gj19Folder("我的文件");
folder2 = new Gj19Folder("图像文件");
folder3 = new Gj19Folder("文本文件");
folder4 = new Gj19Folder("视频文件");
file1 = new Gj19ImageFile("阿拉蕾.jpg");
file2 = new Gj19ImageFile("安吉.gif");
file3 = new Gj19TextFile("饥荒.txt");
file4 = new Gj19TextFile("娇小.doc");
file5 = new Gj19VideoFile("可爱.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();
}
}
五、运行结果:
更多推荐
所有评论(0)