java设计模式-组合模式

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

这里写图片描述

实现的结构可以如下:

这里写图片描述

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

首先是基础接口

/**
 * 文件接口
 * @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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值