-
模拟实现一个基于文本界面的《项目开发团队分配管理软件》
-
熟悉Java面向对象的高级特性,进一步掌握编程技巧和调试技巧
主要涉及以下知识点:
类的继承性和多态性
对象的值传递、接口
static和final修饰符
特殊类的使用:包装类、抽象类、内部类
异常处理
Java基本语法和流程控制
数组,ArrayList集合
系统功能结构图:
系统流程图:
目标:
需求说明:
软件设计结构:
用户注册和登录模块(LoginView类)
开发人员管理模块
在NameListService类中完成功能操作:
实现员工的添加 (根据职业添加(无,程序员,设计师,架构师))
实现员工的修改(至少修改员工的姓名,年龄,工资)
实现员工的删除(注意员工id需要动态显示,也就是删除后,员工id需要更新)
实现员工的查看(显示所有数据)
在domain包中完成各个类的实体类创建`
软件设计结构:
Equipment接口及其实现子类的设计
Employee类及其子类的设计:
开发人员管理模块
**
NameListService类的设计
数据的添加:
employees.add(new Employee(count, "马云 ", 22, 3000));
employees.add(new Architect(++count, "马化腾", 32, 18000, new NoteBook("联想T4", 6000), 60000, 5000));
employees.add(new Programmer(++count, "李彦宏", 23, 7000, new PC("戴尔", "NEC 17寸")));
employees.add(new Programmer(++count, "刘强东", 24, 7300, new PC("戴尔", "三星 17寸")));
employees.add(new Designer(++count, "雷军 ", 50, 10000, new Printer("激光", "佳能2900"), 5000));
employees.add(new Programmer(++count, "任志强", 30, 16800, new PC("华硕", "三星 17寸")));
employees.add(new Designer(++count, "柳传志", 45, 35500, new PC("华硕", "三星 17寸"), 8000));
employees.add(new Architect(++count, "杨元庆", 35, 6500, new Printer("针式", "爱普生20k"), 15500, 1200));
employees.add(new Designer(++count, "史玉柱", 27, 7800, new NoteBook("惠普m6", 5800), 1500));
employees.add(new Programmer(++count, "丁磊 ", 26, 6600, new PC("戴尔", "NEC17寸")));
employees.add(new Programmer(++count, "张朝阳 ", 35, 7100, new PC("华硕", "三星 17寸")));
employees.add(new Designer(++count, "杨致远", 38, 9600, new NoteBook("惠普m6", 5800), 3000));
数据的返回:
//得到所有员工数据集合
public ArrayList<Employee> getAllEmployees() {
return employees;
}
//得到当前员工
public Employee getEmployee(int id) throws TeamException {
for (int i = 0; i < employees.size(); i++) {//遍历员工集合
if (employees.get(i).getId() == id) {//当员工ID与传入ID相同时
return employees.get(i);//返回这个员工的信息
}
}
throw new TeamException("该员工不存在");
}
开发团队调度管理模块
需求说明:
增加团队成员:
public void addMember(Employee e) throws TeamException {
if (total >= MAX_MEMBER){//如果团队人数大于最大人数
throw new TeamException("成员已满,无法添加");}//输出提示
if (!(e instanceof Programmer)) {//判断e是否是Programmer的实例
throw new TeamException("该成员不是开发人员,无法添加");//如果不是则输出提示
}
Programmer p = (Programmer)e;//将Employee强制转换为Programmer类型
if (isExist(p)) {//判断P是否是该团队员工
throw new TeamException("该员工已在本团队中");
}
if(!p.getStatus()) {//如果该员工已是某团队员工
throw new TeamException("该员工已是某团队成员");
}
//计算团队架构师,设计师,程序员的数量
int numOfArch = 0, numOfDsgn = 0, numOfPrg = 0;
for (int i = 0; i < total; i++) {//遍历整个团队
if (team[i] instanceof Architect) {numOfArch++;}
else if (team[i] instanceof Designer){ numOfDsgn++;}
else if (team[i] instanceof Programmer){ numOfPrg++;}
}
//如果p是属于Architect
if (p instanceof Architect) {
if (numOfArch >= 1)//如果数量大于1
{throw new TeamException("团队中至多只能有一名架构师");}//输出提示
} else if (p instanceof Designer) {//如果p是属于Designer
if (numOfDsgn >= 2)//如果数量大于2
{throw new TeamException("团队中至多只能有两名设计师");}//输出提示
} else if (p instanceof Programmer) {
if (numOfPrg >= 3)
{throw new TeamException("团队中至多只能有三名程序员");}
}
//添加到数组
p.setStatus(false);//设置员工状态为已加入团队
p.setMemberId(counter++);//设置员工在团队中的ID
team[total++] = p;//将员工添加到团队数组中并更新总人数
}
开发团队调度管理模块
TeamServics类的设计:
开发项目管理模块
在domain包中完成项目实体类Project的创建:
在service包中完成项目操作类ProjectService的创建:
给项目分配团队(随即分配项目)
public void dealingPro(Programmer[] team) {
int i=0;
if (pro==null){
System.out.println("当前无项目,请先添加项目");
return;
}
System.out.println("当前团队有人员:");
for (Programmer programmer : team) {//遍历
System.out.println(programmer);
}
if(pro.get(i).getTeamName()==null){
System.out.println("请为当前团队创建一个团队名称:");
String teamName = TSUtility.readKeyBoard(6, false);//限制输入内容不可为空
//随机分配项目
Random ra = new Random();
int ranNum = ra.nextInt(pro.size());//生成一个0-pro列表大小之间的随即数
if (pro.get(ranNum).isStatus()){
Project project = this.pro.get(ranNum);//根据随即索引获取项目对象
project.setTeamName(teamName);//将团队名称设置到项目中
project.setTeam(team);//将团队数组设置到项目中
project.setStatus(false);//设置项目的状态为已分配
pro.set(ranNum, project);//将更新后的项目对象重新设置会pro列表中的对应位置
}else {
System.out.println("该项目正在被其他团队开发");
}
}else {
System.out.println(pro.get(i).getTeamName()+"团队正在开发项目");
}
i++;
}
IndexView类的设计: