实验名称 组合模式的应用 日期 2019年 03 月26 日
一、实验目的:
1) 掌握组合模式(Composite)的特点
2) 分析具体问题,使用组合模式进行设计。
文件浏览
文件有不同类型,不同类型的文件其浏览方式有所区别,如文本文件和图片文件的浏览方式就不相同。对文件夹的浏览实际上就是对其中所包含文件的浏览,而客户端可以一致地对文件和文件夹进行操作,无须关心它们的区别。使用组合模式来模拟文件的浏览操作。利用组合者模式设计,用JAVA语言实现 (或C#控制台应用程序实现)。绘制该模式的UML图。
二、实验环境:
三、实验内容:
【模式代码(JAVA语言实现)】
package 软件设计体系结构;
public class FolderTest {
public static void main(String[] args) {
Folder folder = new Folder("总文件夹");
TextFile textFile1 = new TextFile("a.txt");
ImageFile imageFile1 = new ImageFile("a.PNG");
Folder folder2 = new Folder("新建文件夹");
folder.add(textFile1);
folder.add(imageFile1);
folder.add(folder2);
TextFile textFile2 = new TextFile("b.txt");
ImageFile imageFile2 = new ImageFile("b.JPG");
VideoFile videoFile = new VideoFile("a.avi");
folder2.add(textFile2);
folder2.add(imageFile2);
folder2.add(videoFile);
folder2.display();
folder2.remove(imageFile2);
System.out.println("----------------");
folder2.display();
}
}
package 软件设计体系结构;
public abstract class AbstractFile {
public abstract void add(AbstractFile element);
public abstract void remove(AbstractFile element);
public abstract void display();
}
package 软件设计体系结构;
import java.util.ArrayList;
public class Folder extends AbstractFile {
private String fileName;
private ArrayList fileList = new ArrayList();
public Folder(String fileName){
this.fileName = new String();
this.fileName = fileName;
}
public void add(AbstractFile element){
fileList.add(element);
System.out.println("新建 " + element);
}
public void remove(AbstractFile element){
fileList.remove(element);
System.out.println("删除 " + element);
}
public void display(){
for (Object file : fileList){
((AbstractFile)file).display();
System.out.println("打开 " + file);
}
}
}
package 软件设计体系结构;
public class ImageFile extends AbstractFile {
private String fileName;
public ImageFile(String fileName){
this.fileName = new String();
this.fileName = fileName;
}
public void add(AbstractFile element){
System.out.println("添加图片 " + element);
}
public void remove(AbstractFile element){
System.out.println("删除图片 " + element);
}
public void display(){
System.out.println(fileName + " 打开图片并且欣赏");
}
}
package 软件设计体系结构;
public class TextFile extends AbstractFile{
private String fileName;
public TextFile(String fileName){
this.fileName = new String();
this.fileName = fileName;
}
public void add(AbstractFile element){
System.out.println("新增一个文本" + element);
}
public void remove(AbstractFile element){
System.out.println("删除一个文本" + element);
}
public void display(){
System.out.println(fileName + " 打开文本欣赏");
}
}
package 软件设计体系结构;
public class VideoFile extends AbstractFile {
private String fileName;
public VideoFile(String fileName){
this.fileName = new String();
this.fileName = fileName;
}
public void add(AbstractFile element){
System.out.println("增加一个片 " + element);
}
public void remove(AbstractFile element){
System.out.println("删除一个片 " + element);
}
public void display(){
System.out.println(fileName + " 正在播放,在线看片");
}
}
【运行截图】
四、心得体会:
通过本次实验,学会了使用组合模式。组合模式的适用性如下:
想表示对象的部分-整体层次结构
希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。