java设计模式-组合模式

来源:互联网 发布:java入门到精通4 pdf 编辑:程序博客网 时间:2024/06/05 06:45

应用场景:
组合模式就是专门用来处理树形结构的数据,如下图的结构

这里写图片描述

实现的结构可以如下:

这里写图片描述

举个例子说说明实现,这里我们使用查找文件系统的实例:

首先是基础接口

/** * 文件接口 * @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("我的视频文件");    }}

组合模式具有天然的递归调用,我们可以用俩个类就处理递归调用,是不是很简单

0 0
原创粉丝点击