设计模式之组合模式学习笔记

一、组合模式的定义(是什么)?

将对象以树状结构组织起来,并使单个对象和组合对象具有一致性

 抽象构件(component) :使单个对象和组合对象具有一致性

 单个对象(leaf):不可再细分

 组合对象(composite):内部包含单个对象或者组合对象

二、组合模式的作用(为什么)?

将对象组织成树状结构,单个对象和组合对象形成一致性,从而形成天然的递归。

三、组合模式的实现(怎么办)?

创建抽象构件,将单个对象共性提取出来(这里仅仅指安全组合模式)

创建单个对象,继承抽象构件,实现构件的方法

创建组合对象,继承抽象构件,实现构件的方法,并且包含构件对象集合

  如文件目录输出名字:

  

/**
 * 文件(抽象构件)
 */
public abstract class AbstractFile {
    private String name;//文件名
    public abstract String displayName();//展示文件名
}

/**
 * 文本文件(单个对象)
 */
public class TextFile extends AbstractFile {
    private String name;

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

    @Override
    public String displayName() {
        return name+"	";
    }
}

/**
 * 图片文件(单个对象)
 */
public class ImgFile extends AbstractFile {
    private String name;

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

    @Override
    public String displayName() {
        return name+"	";
    }
}

/**
 * 文件夹(组合对象)
 */
public class Folder extends AbstractFile{
    private String name;

    private List<AbstractFile> list;

    public Folder(String name){
        this.name = name;
        list = new ArrayList<AbstractFile>();
    }

    //添加文件
    public void addFile(AbstractFile abstractFile){
        list.add(abstractFile);
    }

    //删除文件
    public void removeFile(AbstractFile abstractFile){
        list.remove(abstractFile);
    }

    //获取文件
    public AbstractFile getAbstractFile(Integer index){
        return list.get(index);
    }

    @Override
    public String displayName() {
        String name = this.name+"(";
        for (AbstractFile file:list) {
            name += file.displayName();
        }
        name += ")";
        return name;
    }
}

public class MyTest {
    
    @Test
    public void test(){
        AbstractFile f1,f2,f3,f4,f5;

        f1 = new TextFile("文本文件1");
        f2 = new TextFile("文本文件2");
        f3 = new ImgFile("图片文件2");
        f4 = new Folder("文件夹1");
        f5 = new Folder("文件夹2");

        ((Folder) f4).addFile(f1);
        ((Folder) f4).addFile(f5);
        ((Folder) f5).addFile(f2);
        ((Folder) f5).addFile(f3);

        //输出文件夹1及内部所有文件名称
        System.out.println(f4.displayName());
    }

}

输出结果为:

四、常用场景

文件目录系统

菜单目录系统

杀毒软件

原文地址:https://www.cnblogs.com/LiuChengGang/p/13088020.html