Java设计模式之结构型模式 | 组合模式

44 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情

觉得对你有益的小伙伴记得点个赞+关注

后续完整内容持续更新中

希望一起交流的欢迎发邮件至javalyhn@163.com

1. 组合模式定义

将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

2. 组合模式角色定义

  • Component抽象构建角色:定义参加组合对象的公有方法和属性。
  • Leaf叶子构件: 叶子对象,其下再没有其他分支。
  • Composite树枝构建: 组合树枝节点和叶子节点形成一个树形结构。

3. 组合模式使用场景

  • 层级结构
  • 部门组织结构
  • 树叶菜单、文件和文件夹管理

4. 组合模式的实现

给定以下学校院系展示案例

image.png

OrganizationComponent

public abstract class OrganizationComponent {
    private String name; //名字
    private String des;//说明
    protected void add(OrganizationComponent organizationComponent){
        //默认实现
        throw new UnsupportedOperationException();
    }

    protected void remove(OrganizationComponent organizationComponent){
        //默认实现
        throw new UnsupportedOperationException();
    }

    //构造器
    public OrganizationComponent(String name, String des) {
        this.name = name;
        this.des = des;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }

    //打印方法  子类都要实现
    protected abstract void print();
}

University

//University就是我们的Composite 可以管理 College
public class University extends OrganizationComponent{
    List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

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

    @Override
    protected void add(OrganizationComponent organizationComponent) {
        organizationComponents.add(organizationComponent);
    }

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponents.remove(organizationComponent);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    //输出University所包含的学院
    @Override
    protected void print() {
        System.out.println("------------" + getName() + "--------------");
        //遍历
        for (OrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }
}

College

public class College extends OrganizationComponent{
    //List 中存放的是 Department
    List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

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

    @Override
    protected void add(OrganizationComponent organizationComponent) {
        //将来实际业务中  College的add和University不一定完全一样
        organizationComponents.add(organizationComponent);
    }

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponents.remove(organizationComponent);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    //输出University所包含的学院
    @Override
    protected void print() {
        System.out.println("------------" + getName() + "--------------");
        //遍历
        for (OrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }
}

Department

public class Department extends OrganizationComponent{
    //没有集合

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

    //add remove 就不需要再写了  因为他是叶子节点

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

    @Override
    public String getDes() {
        return super.getDes();
    }

    @Override
    public String getName() {
        return super.getName();
    }
}

Client

public class Client {
    public static void main(String[] args) {
        //从大到小创建对象
        //学校
        OrganizationComponent university = new University("清华大学", "中国顶级大学");

        //学院
        OrganizationComponent computerCollege = new College("计算机学院", "计算机学院");
        OrganizationComponent infoEngineerCollege = new College("信息工程学院", "信息工程学院");

        //专业
        computerCollege.add(new Department("软件工程","软件工程"));
        computerCollege.add(new Department("计科","可以"));
        computerCollege.add(new Department("网络工程","不错"));

        infoEngineerCollege.add(new Department("信息安全","网络安全"));

        //将学院加入学校
        university.add(computerCollege);
        university.add(infoEngineerCollege);

        university.print();

        //------------清华大学--------------
        //------------计算机学院--------------
        //软件工程
        //计科
        //网络工程
        //------------信息工程学院--------------
        //信息安全
    }
}

5. 组合模式优点

  1. 高层模块调用简单: 一棵树型机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别。
  2. 节点自由增加: 用了组合模式以后,非常容易扩展,对维护非常有利。