设计模式-组合模式(Composite)

 

 

组合模式是构造型模式的一种。通过递归手段构造树形的对象结构,并可以通过一个对象来访问整个对象树

 

角色和职责:

就是文件夹那种形式,树形

 

UML图:

 

具体代码:

import java.util.List;

/**
 * Ifile 统一接口
 */
public interface Ifile {
    void display();//显示
    boolean add(Ifile file);//添加
    boolean remove(Ifile file);//删除
    List<Ifile> getChild();//获取孩子节点
}
import java.util.List;

/**
 * 文件
 */
public class File implements Ifile{
    private String fileName;//文件名
    public File(String fileName){
        this.fileName = fileName;
    }

    @Override
    public void display() {
        System.out.println(fileName);
    }

    @Override
    public boolean add(Ifile file) {
        return false;
    }
    @Override
    public boolean remove(Ifile file) {
        return false;
    }
    @Override
    public List<Ifile> getChild() {
        return null;
    }
}
import java.util.ArrayList;
import java.util.List;

/**
 * 目录
 */
public class Folder implements Ifile{
    private String fileName;//文件名
    private List<Ifile> list = null;//目录集合
    public Folder(String fileName){
        this.fileName = fileName;
        this.list = new ArrayList<Ifile>();
    }

    @Override
    public void display() {
        System.out.println(fileName);
    }

    @Override
    public boolean add(Ifile file) {
        this.list.add(file);
        return true;
    }

    @Override
    public boolean remove(Ifile file) {
        this.list.add(file);
        return true;
    }

    @Override
    public List<Ifile> getChild() {
        return this.list;
    }
}
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Ifile folder_d = new Folder("d:");
        Ifile file_d_aa = new File("aa.txt");
        Ifile folder_d_dingding = new Folder("dingding");
        Ifile folder_d_dingding_bin = new Folder("bin");
        Ifile file_d_dingding_b = new File("可执行文件.exe");
        Ifile file_d_dingding_bin_b = new File("mm.exe");
        Ifile file_d_bb = new File("bb.txt");

        folder_d_dingding_bin.add(file_d_dingding_bin_b);

        folder_d_dingding.add(folder_d_dingding_bin);
        folder_d_dingding.add(file_d_dingding_b);

        folder_d.add(file_d_aa);
        folder_d.add(folder_d_dingding);
        folder_d.add(file_d_bb);

        show(folder_d,0);//显示当前目录下的节点
    }

    /**
     * 显示当前目录下的节点
     * @param file
     */
    public static void show(Ifile file,int deep){
        for(int m=0;m<deep;m++){
            System.out.print("--");
        }
        List<Ifile> list = file.getChild();
        for(int i = 0; i<list.size();i++){
            Ifile fi = list.get(i);
            System.out.print("--");
            if(fi instanceof  File){
                for(int n=0;n<deep-1;n++){
                    System.out.print("--");
                }
                fi.display();
            }else{
                fi.display();
                show(fi,++deep);
            }
        }
    }
}

 结果:

--aa.txt
--dingding
----bin
--------mm.exe
----可执行文件.exe
--bb.txt

优缺点:

优:

  • 可以清楚地定义分层次的复杂类型,表示对象的全部层次或者部分层次  ,它让客户端忽略了层次的差异,方便对整个层次经行控制
  • 客户端可以一致的使用一个组合模式或对单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端的代码
  • 在组合模式种增加新的容器构件和叶子构件都很方便,无需对现有类库进行任何修改,符合开闭原则。
  • 为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合可以形成复杂的树形机构,但对树形结构的控制却很简单

 

应用场景:

在一个使用面向对象语言开发的系统中需要处理一个树形结构的

在一个系统中能分离出叶子和容器的,而且他们的类型还固定不变,需要增加一些新的类型

 

源码地址:https://github.com/qjm201000/design_pattern_composite.git

 

posted @ 2018-12-05 14:48  qjm201000  阅读(178)  评论(0编辑  收藏  举报