设计模式-组合模式的应用

组合模式的应用

文件浏览
文件有不同类型,不同类型的文件其浏览方式有所区别,如文本文件和图片文件的浏览方式就不相同。对文件夹的浏览实际上就是对其中所包含文件的浏览,而客户端可以一致地对文件和文件夹进行操作,无须关心它们的区别。使用组合模式来模拟文件的浏览操作。利用组合者模式设计,用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();
		

	}

}

【运行截图】

组合模式的适用性如下:

  • 你想表示对象的部分-整体层次结构。
  • 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
全部评论

相关推荐

不愿透露姓名的神秘牛友
02-12 10:05
小米集团 算法工程师 28.0k*15.0
泡沫灬一触即破:楼上那个看来是看人拿高薪,自己又不如意搁这泄愤呢是吧,看你过往评论很难不怀疑你的精神状态
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务