第十一章 组合模式

文章介绍了Java中的组合模式,通过抽象类`OrganizationComponent`构建学校、学院和专业类的层次结构。`University`和`College`作为组合类,`Department`作为叶子节点。代码示例展示了如何添加和删除组件以及打印结构。同时,文章提到JDK集合如HashMap如何使用组合模式,并提醒在实现时需要注意的细节。
摘要由CSDN通过智能技术生成


前言

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


一、组合模式基本介绍

在这里插入图片描述
在这里插入图片描述

二、UML类图

在这里插入图片描述

三、完整代码

抽象类,所有类都继承此类

package tanchishell.SJMS.composite;

//抽象类,也可以是接口或者一个实体类
public abstract class OrganizationComponent {
    private String name; // 名字
    private String des; // 说明

    //不能做成抽象方法,因为有的子类不需要实现 add和remove 方法
    protected void add(OrganizationComponent organizationComponent) {
        //默认实现
        throw new UnsupportedOperationException();
    }

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

    //方法 print, 做成抽象的, 子类都需要实现
    protected abstract void print();

    //构造器
    public OrganizationComponent(String name, String des) {
        super();
        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;
    }



}

学校类以父类型引用组合一个学院类

package tanchishell.SJMS.composite;

import java.util.ArrayList;
import java.util.List;

// 学校类 University 就是 Composite , 可以管理 College
public class University extends OrganizationComponent {
    List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

    // 构造器
    public University(String name, String des) {
        super(name, des);//
    }

    // 重写 add
    @Override
    protected void add(OrganizationComponent organizationComponent) {

        organizationComponents.add(organizationComponent);
    }

    // 重写 remove
    @Override
    protected void remove(OrganizationComponent organizationComponent) {

        organizationComponents.remove(organizationComponent);
    }

    // print 方法,就是输出 University 包含的学院
    @Override
    protected void print() {

        System.out.println("--------------" + getName() + "--------------");
        //遍历 organizationComponents
        for (OrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }

    @Override
    public String getName() {

        return super.getName();
    }

    @Override
    public String getDes() {

        return super.getDes();
    }


}

学院类以父类型引用组合一个专业类

package tanchishell.SJMS.composite;

import java.util.ArrayList;
import java.util.List;

//学院类
public class College extends OrganizationComponent{

    List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

    // 构造器
    public College(String name, String des) {
        super(name, des);//
    }

    // 重写 add
    @Override
    protected void add(OrganizationComponent organizationComponent) {

        organizationComponents.add(organizationComponent);
    }

    // 重写 remove
    @Override
    protected void remove(OrganizationComponent organizationComponent) {

        organizationComponents.remove(organizationComponent);
    }

    // print 方法,就是输出 College 包含的专业
    @Override
    protected void print() {

        System.out.println("--------------" + getName() + "--------------");
        //遍历 organizationComponents
        for (OrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }

    @Override
    public String getName() {

        return super.getName();
    }

    @Override
    public String getDes() {

        return super.getDes();
    }
}

专业类,叶子节点,不能再组合其他类

package tanchishell.SJMS.composite;

public class Department extends OrganizationComponent {
    //没有集合
    public Department(String name, String des) {
        super(name, des);
    }
//add , remove 就不用写了,因为他是叶子节点
    @Override
    public String getName() {

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

        return super.getDes();
    }
    @Override
    protected void print() {
        //输出自己的name 就可以了
        System.out.println(getName());
    }
}

测试类

package tanchishell.SJMS.composite;

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("计算机科学与技术", " 计算机科学与技术是老牌的专业 "));

        System.out.println("--------------------------------------------------------------");

        infoEngineercollege.add(new Department("通信工程", " 通信工程不好学 "));
        infoEngineercollege.add(new Department("信息工程", " 信息工程好学 "));
        //将学院加入到 学校
        university.add(computerCollege);
        university.add(infoEngineercollege);
        university.print();
        //输出  信息工程学院
        //infoEngineercollege.print();

        //输出   计算机学院
//        computerCollege.print();
    }
}


输出
--------------------------------------------------------------
--------------清华大学--------------
--------------计算机学院--------------
软件工程
网络工程
计算机科学与技术
--------------信息工程学院--------------
通信工程
信息工程



四、组合模式在JDK集合的源码分析

在这里插入图片描述
在这里插入图片描述

HashMap的组合模式对比我们上面的组合又多做了一层接口 Map 所有的Map子类都实现了Map接口

然后就是一个抽象类 AbstractMap,所有的子类都去继承了这个 抽象类

在这里插入图片描述

和我们上面一样,抽象类这里也抛出了异常,防止叶子节点自动继承该方法,叶子节点不能再进行 put 动作。

在这里插入图片描述

来到 HashMap 继承了 抽象map 和map 接口,而且 put 方法有方法体,有具体实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、组合模式的注意事项和细节

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值