美文网首页
设计模式——组合模式

设计模式——组合模式

作者: 笑对浮华 | 来源:发表于2023-09-26 11:16 被阅读0次

一、介绍

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

二、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这种常用的数据结构就是根据组合模式实现的。

相关文章

网友评论

      本文标题:设计模式——组合模式

      本文链接:https://www.haomeiwen.com/subject/pxxhbdtx.html