设计模式——组合模式

一、介绍

开发中经常会遇到这样一个需求,列表数据做多级显示,对于整体——部分这类场景可以用组合模式来解决,提取出公共信息成立一个基类,多级结构分级成立不同的类,分别都继承基类,实现基类中定义的方法,同时在各级子类中聚合基类,形成根节点中包含下一级根节点和叶子节点这种树状结构。

二、UML类图

组合模式

这个例子中是需要展示学校下属学院,学院下属的系,多级分层全部显示,这里提取出学校、学院、系的公共信息,包含了名字、添加和删除操作,将这些公共信息成立一个基类Organization,同时定义一个print方法,需要各级机构去实现,各级机构继承基类的同时,还要聚合基类,这样使得各级子结构可以添加、删除自己的根节点和叶子节点,实现多级树状结构。

三、代码示例

public abstract class Organization {

    private String mName;

    public Organization(String name) {
        this.mName = name;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name){
        mName = name;
    }

    protected void addOrganization(Organization organization){}

    protected void removeOrganization(Organization organization){}

    protected abstract void print();
}
public class University extends Organization{

    private final List<Organization> mOrganizations = new ArrayList<>();

    public University(String name) {
        super(name);
    }

    @Override
    protected void addOrganization(Organization organization) {
        super.addOrganization(organization);
        mOrganizations.add(organization);
    }

    @Override
    protected void removeOrganization(Organization organization) {
        super.removeOrganization(organization);
        mOrganizations.remove(organization);
    }

    @Override
    protected void print() {
        System.out.println("***********"+getName()+"***********");
        for (Organization organization : mOrganizations) {
            organization.print();
        }
    }
}
public class College extends Organization{

    private final List<Organization> mOrganizations = new ArrayList<>();

    public College(String name) {
        super(name);
    }

    @Override
    protected void addOrganization(Organization organization) {
        super.addOrganization(organization);
        mOrganizations.add(organization);
    }

    @Override
    protected void removeOrganization(Organization organization) {
        super.removeOrganization(organization);
        mOrganizations.remove(organization);
    }

    @Override
    protected void print() {
        System.out.println("  *********"+getName()+"*********  ");
        for (Organization organization : mOrganizations) {
            organization.print();
        }
    }
}
public class Department extends Organization{

    public Department(String name) {
        super(name);
    }

    @Override
    protected void print() {
        System.out.println("    *******"+getName()+"*******    ");
    }
}

组合模式关键在于提取公共信息成立一个基类,让各级子类都去继承这个基类,同时定义一个抽象方法,各级子类根据各自的业务去实现这个抽象方法,从而形成各级结构的差异化,子类聚合基类的处理方式使得系统实现层级结构。

四、总结

对于对数据需要进行整体——部分分层处理的这种场景,组合模式尤为合适,这种模式上层结构不需要关心下层处理的是单层对象还是组合对象,下层结果自行根据自己是根节点还是叶子节点去递归处理。在Java中HashMap这种常用的数据结构就是根据组合模式实现的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式-组合模式 定义 我们知道古代的皇帝想要管理国家,是不可能直接管理到具体每一个老百姓的,因此设置了很多机构...
    RUMyCola阅读 3,644评论 0 3
  • 组合模式(Composite) 在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部...
    Acton_zhang阅读 3,196评论 0 1
  • 组合模式介绍 组合模式(Composite Pattern)也称为部分整体模式(Part-Whole Patter...
    小的橘子阅读 4,676评论 0 0
  • 在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包...
    木子教程阅读 3,308评论 0 1
  •   注意:如果不想浪费时间,请一定要点我。   在现实生活中,存在很多“部分-整体”的关系,例如,大学中的专业与学...
    布鲁斯理阅读 1,124评论 0 0