在学习完 Java 基础编程的全部知识点后,为了更加熟悉 Java 面向对象的高级特性,进一步掌握编程技巧和调试技巧,实现模拟一个基于文本界面的开发团队调度软件,并以文档的形式记录软件设计结构、实现方法和一些疑难之处,主要涉及类的继承性和多态性、对象的值传递和接口、static 和 final 修饰符、特殊类的使用(包装类、抽象类、内部类)、异常处理等知识点。以下为我在实战练习过程中所做的笔记,可供参考。
软件需求
- 软件启动时,根据给定的数据创建公司部分成员列表(数组)
- 根据菜单提示,基于现有的公司成员,组建一个开发团队以开发一个新的项目
- 组建过程包括将成员插入到团队中,或从团队中删除某成员,还可以列出团队中现有成员的列表
- 开发团队成员包括架构师、设计师和程序员
需求分析
- 软件采用单级菜单方式工作,当软件运行时,主界面显示公司成员的列表
- 当选择“添加团队成员”菜单时,将执行从列表中添加指定(通过 ID)成员到开发团队的功能
- 如果添加操作因某种原因失败,将显示失败信息(失败原因视具体原因而不同)
- 当选择“删除团队成员”菜单时,将执行从开发团队中删除指定(通过 TeamID)成员的功能
- 当选择“团队列表”菜单时,将列出开发团队中的现有成员
软件设计结构
- 软件由 view、service、domain 三个模块组成
com.atguigu.team.view
模块为主控模块,负责菜单的显示和处理用户操作com.atguigu.team.service
模块为实体对象(Employee 及其子类如程序员等)的管理模块,NameListService
和TeamService
类分别用各自的数组来管理公司员工和开发团队成员对象- domain 模块为 Employee 及其子类等 JavaBean 类所在的包
com.atguigu.team.domain
模块中包含了所有实体类- 其中 Programmer 及其子类,均会领用 Equipment
创建项目基本组件
- 创建
TeamSchedule
项目,按照设计要求创建所有包,将项目提供的几个类复制到相应的包中- view 包中:TSUtility.java
- service包中:Data.java
- 按照设计要求,在 com.atguigu.team.domain 包中,创建 Equipment 接口及其各实现子类代码
- 按照设计要求,在 com.atguigu.team.domain 包中,创建 Employee 类及其各子类代码
- 检验代码的正确性
键盘访问的实现
- 项目 view 包中提供了 TSUtility.java 类,提供了以下静态方法,可用来方便地实现键盘访问
- public static char readMenuSelection():该方法读取键盘,如果用户键入’1’-’4’中的任意字符,则方法返回。返回值为用户键入字符
- public static void readReturn():该方法提示并等待,直到用户按回车键后返回
- public static int readInt():该方法从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值
- public static char readConfirmSelection():从键盘读取‘Y’或’N’,并将其作为方法的返回值
Equipment 接口及其实现子类的设计
- 根据需要提供各属性的 get/set 方法以及重载构造器
- 实现类实现接口的方法,返回各自属性的信息
Employee 类及其子类的设计
- memberId 用来记录成员加入开发团队后在团队中的 ID
- Status 是项目 service 包下自定义的类,声明三个对象属性,分别表示成员的状态
- FREE-空闲
- BUSY-已加入开发团队
- VOCATION-正在休假
- equipment 表示该成员领用的设备
- bonus 表示奖金
- stock 表示公司奖励的股票数量
- 可根据需要为类提供各属性的 get/set 方法以及重载构造器
Status 类
Status 枚举类位于 com.atguigu.team.service 包中,封装员工的状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package com.atguigu.team.service;
public class Status {
private final String NAME;
private Status(String name) {
this.NAME = name;
}
public static final Status FREE = new Status("FREE");
public static final Status VOCATION = new Status("VOCATION");
public static final Status BUSY = new Status("BUSY");
public String getNAME() {
return NAME;
}
public String toString() {
return NAME;
}
}
实现 service 包中的类
- 按照设计要求编写 NameListService 类
- 在 NameListService 类中临时添加一个 main 方法中,作为单元测试方法
- 在方法中创建 NameListService 对象,然后分别用模拟数据调用该对象的各个方法,以测试是否正确
- 测试应细化到包含了所有非正常的情况,以确保方法完全正确
- 重复以上3步,完成 TeamService 类的开发
NameListService 类的设计
- 负责将 Data 中的数据封装到 Employee[] 数组中,同时提供相关操作 Employee[] 的方法
- employees 用来保存公司所有员工对象
- NameListService() 构造器
- 根据项目提供的 Data 类构建相应大小的 employees 数组
- 再根据 Data 类中的数据构建不同的对象,包括 Employee、Programmer、Designer 和 Architect 对象,以及相关联的 Equipment 子类的对象
- 将对象存于数组中
- Data类位于 com.atguigu.team.service 包中
- getAllEmployees():获取当前所有员工
- 返回:包含所有员工对象的数组
- getEmployee(id : int):获取指定ID的员工对象
- 参数:指定员工的 ID
- 返回:指定员工对象
- 异常:找不到指定的员工
- 在 service 子包下提供自定义异常类:TeamException
- 另外,可根据需要自行添加其他方法或重载构造器
TeamService 类的设计
- 关于开发团队成员的管理:添加、删除等
- counter 为静态变量,用来为开发团队新增成员自动生成团队中的唯一 ID,即 memberId(应使用增1的方式)
- MAX_MEMBER:表示开发团队最大成员数
- team数组:用来保存当前团队中的各成员对象
- total:记录团队成员的实际人数
- getTeam() :返回当前团队的所有对象
- 返回:包含所有成员对象的数组,数组大小与成员人数一致
- addMember(e: Employee):向团队中添加成员
- 参数:待添加成员的对象
- 异常:添加失败,TeamException 中包含了失败原因
- removeMember(memberId: int):从团队中删除成员
- 参数:待删除成员的 memberId
- 异常:找不到指定 memberId 的员工,删除失败
- 另外,可根据需要自行添加其他方法或重载构造器
实现 view 包中类
- 按照设计要求编写 TeamView 类,逐一实现各个方法,并编译
- 执行 main 方法中,测试软件全部功能
TeamView 类的设计
- listSvc 和 teamSvc 属性:供类中的方法使用
- enterMainMenu():主界面显示及控制方法
- 以下方法仅供 enterMainMenu() 调用:
- listAllEmployees():以表格形式列出公司所有成员
- getTeam():显示团队成员列表操作
- addMember():实现添加成员操作
- deleteMember():实现删除成员操作