【java设计模式】-09组合模式

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/u010647035/article/details/85227137

1、概述

组合模式(Composite Pattern),又叫部分整体模式,是把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

2、组合模式结构

在这里插入图片描述

3、代码实现

3.1、普通实现

/**
 * 文件对象
 *
 * @author kaifeng
 * @date 2018/12/23
 */
public class File {
    private String name;

    public File(String name) {
        this.name = name;
    }

    public void list() {
        System.out.println(CompositeDemo.compositeBuilder + name);
    }
}


/**
 * 目录对象
 *
 * @author kaifeng
 * @date 2018/12/23
 */
public class Directory {
    private String name;
    private ArrayList includedFiles = new ArrayList();

    public Directory(String name) {
        this.name = name;
    }

    public void add(Object obj) {
        includedFiles.add(obj);
    }

    public void list() {
        System.out.println(CompositeDemo.compositeBuilder + name);
        CompositeDemo.compositeBuilder.append("   ");
        for (Object obj : includedFiles) {
            String name = obj.getClass().getSimpleName();
            if (name.equals("Directory")) {
                ((Directory)obj).list();
            } else {
                ((File)obj).list();
            }
        }
        CompositeDemo.compositeBuilder.setLength(CompositeDemo.compositeBuilder.length() - 3);
    }
}


/**
 * 普通实现方式
 *
 * @author kaifeng
 * @date 2018/12/23
 */
public class CompositeGeneralDemo {
    public static StringBuilder compositeBuilder = new StringBuilder();

    public static void main(String[] args) {
        Directory d1 = new Directory("一级目录(01)");
        Directory d2 = new Directory("二级目录(02)");
        Directory d3 = new Directory("三级目录(03)");

        File track1 = new File("File_01_01");
        File track2 = new File("File_01_02");
        File track3 = new File("File_02_01");
        File track4 = new File("File_02_02");
        File track5 = new File("File_03_01");

        d1.add(track1);
        d1.add(d2);
        d1.add(track2);

        d2.add(track3);
        d2.add(track4);
        d2.add(d3);

        d3.add(track5);

        d1.list();
    }
}

输出结果:

一级目录(01)
   File_01_01
   二级目录(02)
      File_02_01
      File_02_02
      三级目录(03)
         File_03_01
   File_01_02

3.2、组合模式实现

/**
 * 抽象文件接口
 *
 * @author kaifeng
 * @date 2018/12/23
 */
interface AbstractFile {
    void list();
}

/**
 * 目录对象实现类
 *
 * @author kaifeng
 * @date 2018/12/23
 */
public class CmpDirectory implements AbstractFile {
    private String name;
    private ArrayList includedFiles = new ArrayList();

    public CmpDirectory(String name) {
        this.name = name;
    }

    public void add(Object obj) {
        includedFiles.add(obj);
    }

    @Override
    public void list() {
        System.out.println(CompositeDemo.compositeBuilder + name);
        CompositeDemo.compositeBuilder.append("   ");
        for (Object includedFile : includedFiles) {
            AbstractFile obj = (AbstractFile) includedFile;
            obj.list();
        }
        CompositeDemo.compositeBuilder.setLength(CompositeDemo.compositeBuilder.length() - 3);
    }
}

/**
 * 文件对象实现类
 *
 * @author kaifeng
 * @date 2018/12/23
 */
public class CmpFile implements AbstractFile {

    private String name;

    public CmpFile(String name) {
        this.name = name;
    }

    @Override
    public void list() {
        System.out.println(CompositeDemo.compositeBuilder + name);
    }
}

/**
 * 组合模式客户端调用
 *
 * @author kaifeng
 * @date 2018/12/23
 */
public class CompositeDemo {
    public static StringBuilder compositeBuilder = new StringBuilder();

    public static void main(String[] args) {
        CmpDirectory d1 = new CmpDirectory("一级目录(01)");
        CmpDirectory d2 = new CmpDirectory("二级目录(02)");
        CmpDirectory d3 = new CmpDirectory("三级目录(03)");

        CmpFile track1 = new CmpFile("File_01_01");
        CmpFile track2 = new CmpFile("File_01_02");
        CmpFile track3 = new CmpFile("File_02_01");
        CmpFile track4 = new CmpFile("File_02_02");
        CmpFile track5 = new CmpFile("File_03_01");

        d1.add(track1);
        d1.add(d2);
        d1.add(track2);

        d2.add(track3);
        d2.add(track4);
        d2.add(d3);

        d3.add(track5);

        d1.list();
    }
}

4、组合模式应用场景

这种组合模式正是为树形结构而生,所以组合模式的使用场景就是出现树形结构的地方。比如:文件目录显示,多级目录呈现等树形结构数据的操作。

5、组合模式优缺点

优点:

1、高层模块调用简单。

2、节点自由增加。

缺点:

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

猜你喜欢

转载自blog.csdn.net/u010647035/article/details/85227137