JavaSE进阶

4、编写业务类TeamService

package com.atguigu.service;

 

import com.atguigu.bean.Architect;

import com.atguigu.bean.Designer;

import com.atguigu.bean.Employee;

import com.atguigu.bean.Programmer;

import com.atguigu.bean.Status;

 

public class TeamService {

    private static int counter = 1;//用于控制团队中团队成员的ID,每增加一个就自动增1,删除成员是不减1,一直往上增,只是个编号

                                //就如同银行的叫号系统,过号了,也是继续往下增

                                //如同学号,有同学退学,休学啥的,原来那个学号也不用了,一直往下递增

    private final int MAX_MEMBER = 5; //团队最多容纳的人数

    private Programmer[] team = new Programmer[MAX_MEMBER];

    private int total = 0;//记录团队的实际人数

 

    private int numOfArch = 0, numOfDsgn = 0, numOfPrg = 0;//分别用于记录架构师,设计师,程序员的数量

 

    public TeamService() {

    }

 

    //供团队列表时调用,返回实际团队的成员信息,不能直接返回team,否则其中可能有空元素

    public Programmer[] getTeam() {

        Programmer[] team = new Programmer[total];

 

        for (int i = 0; i < total; i++) {

            team[i] = this.team[i];

        }

        return team;

    }

 

    //添加人员到团队中

    public void addMember(Employee e) throws TeamException {

        if (total >= MAX_MEMBER)

            throw new TeamException("成员已满,无法添加");

        if (!(e instanceof Programmer))

            throw new TeamException("该成员不是开发人员,无法添加");

 

        Programmer p = (Programmer)e;

        switch (p.getStatus()) {

            case BUSY    :throw new TeamException("该员已是团队成员");

            case VOCATION:throw new TeamException("该员正在休假,无法添加");

        }

 

        if (isExist(p))

            throw new TeamException("该员工已是团队成员");

 

        //注意if..else if条件的顺序,Programmer包含Designer,Designer包含Architect

        if (p instanceof Architect) {

            if (numOfArch >= 1) throw new TeamException("团队中只能有一名架构师");

        } else if (p instanceof Designer) {

            if (numOfDsgn >= 2) throw new TeamException("团队中只能有两名设计师");

        } else if (p instanceof Programmer) {

            if (numOfPrg >= 3) throw new TeamException("团队中只能有三名程序员");

        }

 

        p.setStatus(Status.BUSY);//修改员工状态为忙,这样别的团队就不会再选择他了

        p.setMemberId(counter++);//设置在团队中的memberId

        team[total] = p;//把人员添加到开发团队的数组中

        total++;//总人数+1

 

        //相应工种的人的数量+1

        if (p instanceof Architect) {

        numOfArch++;

        } else if (p instanceof Designer) {

        numOfDsgn++;

        } else if (p instanceof Programmer) {

        numOfPrg++;

        }

    }

 

    //判断新添加的员工是否已经是团队成员

    private boolean isExist(Programmer p) {

        for (int i = 0; i < total; i++) {

            if (team[i].getId() == p.getId()) return true;

        }

        return false;

    }

 

    //删除团队成员

    public void removeMember(int memberId) throws TeamException {

        int n = 0;//记录要删除的员工的下标

        for (; n < total; n++) {

            if (team[n].getMemberId() == memberId) {

                team[n].setStatus(Status.FREE);

                break;

            }

        }

        if (n == total)//上一个for中没有break出来,那么退出循环是因为n<total不成立,那么说没有找到该成员

            throw new TeamException("找不到该成员,无法删除");

 

        //删除时,把后面的元素往前移动

        for (int i = n + 1; i < total; i++) {

            team[i - 1] = team[i];//后一个元素复制给前一个元素

        }

        team[--total] = null;//总人数减1,最后一个元素因为已经复制到前一个元素中了,因此置为null

    }

}