设计模式-组合模式的应用
组合模式的应用
文件浏览
文件有不同类型,不同类型的文件其浏览方式有所区别,如文本文件和图片文件的浏览方式就不相同。对文件夹的浏览实际上就是对其中所包含文件的浏览,而客户端可以一致地对文件和文件夹进行操作,无须关心它们的区别。使用组合模式来模拟文件的浏览操作。利用组合者模式设计,用JAVA语言实现 (或C#控制台应用程序实现)。绘制该模式的UML图。
【模式UML图】
【模式代码(JAVA语言实现)】
// AbstractFile.java:
package sdp.sy_5.compositepattern;
public abstract class AbstractFile {
public void add(AbstractFile element) {
}
public void remove(AbstractFile element) {
}
public void display() {
}
}
// ImageFile.java:
package sdp.sy_5.compositepattern;
public class ImageFile extends AbstractFile{
private String fileName;
public ImageFile(String fileName) {
this.fileName = fileName;
}
@Override
public void add(AbstractFile element) {
System.out.println(fileName+" ImageFile add successfully!");
}
@Override
public void remove(AbstractFile element) {
System.out.println(fileName+" ImageFile remove successfullly!");
}
@Override
public void display() {
System.out.print(fileName);
}
}
// TextFile.java:
package sdp.sy_5.compositepattern;
public class TextFile extends AbstractFile{
private String fileName;
public TextFile(String fileName) {
this.fileName = fileName;
}
@Override
public void add(AbstractFile element) {
System.out.println(fileName+" TextFile add successfully!");
}
@Override
public void remove(AbstractFile element) {
System.out.println(fileName+" TextFile remove successfully!");
}
@Override
public void display() {
System.out.print(fileName);
}
}
// VideoFile.java:
package sdp.sy_5.compositepattern;
public class VideoFile extends AbstractFile{
private String fileName;
public VideoFile(String fileName) {
this.fileName = fileName;
}
@Override
public void add(AbstractFile element) {
System.out.println(fileName+" VideoFile add successfully!");
}
@Override
public void remove(AbstractFile element) {
System.out.println(fileName+" VideoFile remove successfully!");
}
@Override
public void display() {
System.out.print(fileName);
}
}
// Folder.java:
package sdp.sy_5.compositepattern;
import java.util.ArrayList;
public class Folder extends AbstractFile{
private ArrayList<AbstractFile> fileList = new ArrayList<AbstractFile>();
private String fileName;
public Folder(String fileName) {
this.fileName = fileName;
}
@Override
public void add(AbstractFile element) {
fileList.add(element);
element.display();
System.out.println(" add to "+fileName+" successfully!");
}
@Override
public void remove(AbstractFile element) {
fileList.remove(element);
element.display();
System.out.println(" remove to "+fileName+" successfully!");
}
@Override
public void display() {
System.out.println("FolderName:"+fileName);
System.out.println("FileName:");
for(Object object:fileList)
{
((AbstractFile)object).display();
System.out.println();
}
}
}
// Client.java:
package sdp.sy_5.compositepattern;
public class Client {
public static void main(String[] args) {
AbstractFile imageFile,textFile,videoFile;
Folder folder;
imageFile = new ImageFile("image.img");
textFile = new TextFile("text.txt");
videoFile = new VideoFile("video.mp4");
folder = new Folder("testFolder");
System.out.println("add file to folder:");
folder.add(imageFile);
folder.add(textFile);
folder.add(videoFile);
System.out.println("display folder:");
folder.display();
System.out.println("------------------------");
System.out.println("remove file with folder:");
folder.remove(imageFile);
folder.remove(textFile);
folder.remove(videoFile);
System.out.println("display folder:");
folder.display();
}
}
【运行截图】
组合模式的适用性如下:
- 你想表示对象的部分-整体层次结构。
- 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。