应用场景:
组合模式就是专门用来处理树形结构的数据,如下图的结构
实现的结构可以如下:
举个例子说说明实现,这里我们使用查找文件系统的实例:
首先是基础接口
/**
* 文件接口
* @author liuxg
* @date 2016年5月25日 下午8:21:54
*/
public interface IFile {
boolean searchFile(String fileName);
}
定义叶子节点接口继承于IFile,还有其实现类
public interface File extends IFile{
}
class ImageFile implements File{
private String fileName ;
public ImageFile(String fileName) {
this.fileName = fileName ;
}
@Override
public boolean searchFile(String searchFileName) {
System.out.println("查找图片名称为" + fileName);
if (fileName.equals(searchFileName)) {
return true ;
}
return false;
}
}
class TxtFile implements File{
private String fileName ;
public TxtFile(String fileName) {
this.fileName = fileName ;
}
@Override
public boolean searchFile(String searchFileName) {
System.out.println("查找文本文件名称为" + fileName);
if (fileName.equals(searchFileName)) {
System.out.println("已经查找到文件为:" + fileName);
return true ;
}
return false;
}
}
class VideoFile implements File{
private String fileName ;
public VideoFile(String fileName) {
this.fileName = fileName ;
}
@Override
public boolean searchFile(String searchFileName) {
System.out.println("查找视频文件名称为" + fileName);
if (fileName.equals(searchFileName)) {
System.out.println("已经查找到文件为:" + fileName);
return true ;
}
return false;
}
}
再定义父节点接口还有实现类
/**
* 文件夹
* @author liuxg
* @date 2016年5月25日 下午8:27:19
*/
public interface IFolder extends IFile{
File addFile(File file);
void removeFile(File file);
List<File> findChildren();
}
class Folder implements IFolder{
private List<File> files = new ArrayList<File>();
@Override
public boolean searchFile(String fileName) {
boolean b = false ;
for (File file : files) {
b = file.searchFile(fileName);
}
return b;
}
@Override
public File addFile(File file) {
files.add(file);
return file;
}
@Override
public void removeFile(File file) {
files.remove(file);
}
@Override
public List<File> findChildren() {
return files;
}
}
最后我们客户端使用测试
public class Client01 {
public static void main(String[] args) {
File f1 = new ImageFile("我的图片文件");
File f2 = new TxtFile("我的文本文件");
File f3 = new VideoFile("我的视频文件");
IFolder folder = new Folder();
folder.addFile(f1);
folder.addFile(f2);
folder.addFile(f3);
folder.searchFile("我的视频文件");
}
}
组合模式具有天然的递归调用,我们可以用俩个类就处理递归调用,是不是很简单