com.atguigu.team.domain
Architect.java
package com.atguigu.team.domain; public class Architect extends Designer{ private int stock;//股票 public Architect() { super(); } public Architect(int id, String name, int age, double salary, Equipment equipment, double bonus, int stock) { super(id, name, age, salary, equipment, bonus); this.stock = stock; } public int getStock() { return stock; } public void setStock(int stock) { this.stock = stock; } @Override public String toString() { return getDetails() + " 架构师 " + getStatus() + " " + getBonus() + " " + stock + " " + getEquipment().getDescription(); } // 1/2 马化腾 32 18000.0 架构师 15000.0 2000 public String getDetailsForTeam() { return getTeamBaseDetails() + " 架构师 " + getBonus() + " " + getStock(); } }
Designer.java
package com.atguigu.team.domain; public class Designer extends Programmer { private double bonus;// 奖金 public Designer() { super(); } public Designer(int id, String name, int age, double salary, Equipment equipment, double bonus) { super(id, name, age, salary, equipment); this.bonus = bonus; } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } @Override public String toString() { return getDetails() + " 设计师 " + getStatus() + " " + bonus + " " + getEquipment().getDescription(); } // 3/5 雷军 28 10000.0 设计师 5000.0 public String getDetailsForTeam() { return getTeamBaseDetails() + " 设计师 " + getBonus(); } }
Employee.java
package com.atguigu.team.domain; public class Employee { private int id; private String name; private int age; private double salary; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public Employee() { super(); } public Employee(int id, String name, int age, double salary) { super(); this.id = id; this.name = name; this.age = age; this.salary = salary; } public String getDetails(){ return id + " " + name + " " + age + " " + salary; } @Override public String toString() { return getDetails(); } }
Equipment.java
package com.atguigu.team.domain; public interface Equipment { // public abstract String getDescription(); String getDescription(); }
NoteBook.java
package com.atguigu.team.domain; public class NoteBook implements Equipment { private String model;//机器型号 private double price;//价格 public String getModel() { return model; } public void setModel(String model) { this.model = model; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public NoteBook() { super(); } public NoteBook(String model, double price) { super(); this.model = model; this.price = price; } @Override public String getDescription() { return model + "(" + price + ")"; } }
PC.java
package com.atguigu.team.domain; public class PC implements Equipment { private String model;// 机器型号 private String display;// 显示器名称 public PC() { super(); } public PC(String model, String display) { super(); this.model = model; this.display = display; } public String getModel() { return model; } public void setModel(String model) { this.model = model; } public String getDisplay() { return display; } public void setDisplay(String display) { this.display = display; } @Override public String getDescription() { return model + "(" + display + ")"; } }
Printer.java
package com.atguigu.team.domain; public class Printer implements Equipment { private String name;// 机器型号 private String type;// 机器类型 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Printer() { super(); } public Printer(String name, String type) { super(); this.name = name; this.type = type; } @Override public String getDescription() { return name + "(" + type + ")"; } }
Programmer.java
package com.atguigu.team.domain; import com.atguigu.team.service.Status; public class Programmer extends Employee{ private int memberId;//开发团队中的id private Status status = Status.FREE; private Equipment equipment; public Programmer() { super(); } public Programmer(int id, String name, int age, double salary,Equipment equipment) { super(id, name, age, salary); this.equipment = equipment; } public int getMemberId() { return memberId; } public void setMemberId(int memberId) { this.memberId = memberId; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } public Equipment getEquipment() { return equipment; } public void setEquipment(Equipment equipment) { this.equipment = equipment; } @Override public String toString() { return getDetails() + " 程序员 " + status + " " + equipment.getDescription(); } public String getTeamBaseDetails(){ return memberId + "/" + getId() + " " + getName() + " " + getAge() + " " + getSalary(); } //2/6 任志强 22 6800.0 程序员 public String getDetailsForTeam(){ return getTeamBaseDetails() + " 程序员"; } }
com.atguigu.team.junit
NameListServiceTest.java
package com.atguigu.team.junit; import org.junit.Test; import com.atguigu.team.domain.Employee; import com.atguigu.team.service.NameListService; import com.atguigu.team.service.TeamException; /** * 对NameListService类的测试 * @Description * */ public class NameListServiceTest { @Test public void testGetAllEmployees(){ NameListService service = new NameListService(); Employee[] employees = service.getAllEmployees(); for(int i = 0;i < employees.length;i++){ System.out.println(employees[i]); } } @Test public void testGetEmployee(){ NameListService service = new NameListService(); int id = 1; id = 101; try { Employee employee = service.getEmployee(id); System.out.println(employee); } catch (TeamException e) { System.out.println(e.getMessage()); } } }
com.atguigu.team.service
Data.java
package com.atguigu.team.service; public class Data { public static final int EMPLOYEE = 10; public static final int PROGRAMMER = 11; public static final int DESIGNER = 12; public static final int ARCHITECT = 13; public static final int PC = 21; public static final int NOTEBOOK = 22; public static final int PRINTER = 23; //Employee : 10, id, name, age, salary //Programmer: 11, id, name, age, salary //Designer : 12, id, name, age, salary, bonus //Architect : 13, id, name, age, salary, bonus, stock public static final String[][] EMPLOYEES = { {"10", "1", "马云", "22", "3000"}, {"13", "2", "马化腾", "32", "18000", "15000", "2000"}, {"11", "3", "李彦宏", "23", "7000"}, {"11", "4", "刘强东", "24", "7300"}, {"12", "5", "雷军", "28", "10000", "5000"}, {"11", "6", "任志强", "22", "6800"}, {"12", "7", "柳传志", "29", "10800","5200"}, {"13", "8", "杨元庆", "30", "19800", "15000", "2500"}, {"12", "9", "史玉柱", "26", "9800", "5500"}, {"11", "10", "丁磊", "21", "6600"}, {"11", "11", "张朝阳", "25", "7100"}, {"12", "12", "杨致远", "27", "9600", "4800"} }; //如下的EQUIPMENTS数组与上面的EMPLOYEES数组元素一一对应 //PC :21, model, display //NoteBook:22, model, price //Printer :23, name, type public static final String[][] EQUIPMENTS = { {}, {"22", "联想T4", "6000"}, {"21", "戴尔", "NEC17寸"}, {"21", "戴尔", "三星 17寸"}, {"23", "佳能 2900", "激光"}, {"21", "华硕", "三星 17寸"}, {"21", "华硕", "三星 17寸"}, {"23", "爱普生20K", "针式"}, {"22", "惠普m6", "5800"}, {"21", "戴尔", "NEC 17寸"}, {"21", "华硕","三星 17寸"}, {"22", "惠普m6", "5800"} }; }
NameListService.java
package com.atguigu.team.service; import com.atguigu.team.domain.Architect; import com.atguigu.team.domain.Designer; import com.atguigu.team.domain.Employee; import com.atguigu.team.domain.Equipment; import com.atguigu.team.domain.NoteBook; import com.atguigu.team.domain.PC; import com.atguigu.team.domain.Printer; import com.atguigu.team.domain.Programmer; import static com.atguigu.team.service.Data.*; /** * * @Description 负责将Data中的数据封装到Employee[]数组中,同时提供相关操作Employee[]的方法。 * */ public class NameListService { private Employee[] employees; /** * 给employees及数组元素进行初始化 */ public NameListService(){ // 1.根据项目提供的Data类构建相应大小的employees数组 // 2.再根据Data类中的数据构建不同的对象,包括Employee、Programmer、Designer和Architect对象,以及相关联的Equipment子类的对象 // 3.将对象存于数组中 employees = new Employee[EMPLOYEES.length]; for(int i = 0;i < employees.length;i++){ //获取员工的类型 int type = Integer.parseInt(EMPLOYEES[i][0]); //获取Employee的4个基本信息 int id = Integer.parseInt(EMPLOYEES[i][1]); String name = EMPLOYEES[i][2]; int age = Integer.parseInt(EMPLOYEES[i][3]); double salary = Double.parseDouble(EMPLOYEES[i][4]); //获取信息 Equipment equipment; double bonus; int stock; switch(type){ case EMPLOYEE: employees[i] = new Employee(id, name, age, salary); break; case PROGRAMMER: equipment = createEquipment(i); employees[i] = new Programmer(id, name, age, salary, equipment); break; case DESIGNER: equipment = createEquipment(i); bonus = Double.parseDouble(EMPLOYEES[i][5]); employees[i] = new Designer(id, name, age, salary, equipment, bonus); break; case ARCHITECT: equipment = createEquipment(i); bonus = Double.parseDouble(EMPLOYEES[i][5]); stock = Integer.parseInt(EMPLOYEES[i][6]); employees[i] = new Architect(id, name, age, salary, equipment, bonus, stock); break; } } } /** * * @Description 获取指定index上的员工的设备 * @param i * @return */ private Equipment createEquipment(int index) { int key = Integer.parseInt(EQUIPMENTS[index][0]); String modelOrName = EQUIPMENTS[index][1]; switch(key){ case PC://21 String display = EQUIPMENTS[index][2]; return new PC(modelOrName, display); case NOTEBOOK://22 double price = Double.parseDouble(EQUIPMENTS[index][2]); return new NoteBook(modelOrName, price); case PRINTER://23 String type = EQUIPMENTS[index][2]; return new Printer(modelOrName, type); } return null; } /** * 获取当前所有员工。 * @Description * @return */ public Employee[] getAllEmployees(){ return employees; } /** * * @Description 获取指定ID的员工对象。 * @param id * @return * @throws TeamException */ public Employee getEmployee(int id) throws TeamException{ for(int i = 0;i < employees.length;i++){ if(employees[i].getId() == id){ return employees[i]; } } throw new TeamException("找不到指定的员工"); } }
Status.java
package com.atguigu.team.service; /** * * @Description 表示员工的状态 * */ 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 BUSY = new Status("BUSY"); public static final Status VOCATION = new Status("VOCATION"); public String getNAME() { return NAME; } @Override public String toString() { return NAME; } }
TeamException.java
package com.atguigu.team.service; /** * * @Description 自定义异常类 * */ public class TeamException extends Exception{ static final long serialVersionUID = -3387514229948L; public TeamException(){ super(); } public TeamException(String msg){ super(msg); } }
TemService.java
package com.atguigu.team.service; import com.atguigu.team.domain.Architect; import com.atguigu.team.domain.Designer; import com.atguigu.team.domain.Employee; import com.atguigu.team.domain.Programmer; /** * * @Description 关于开发团队成员的管理:添加、删除等。 * @version * */ public class TeamService { private static int counter = 1;//给memberId赋值使用 private final int MAX_MEMBER = 5;//限制开发团队的人数 private Programmer[] team = new Programmer[MAX_MEMBER];//保存开发团队成员 private int total;//记录开发团队中实际的人数 public TeamService() { super(); } /** * * @Description 获取开发团队中的所有成员 */ public Programmer[] getTeam(){ Programmer[] team = new Programmer[total]; for(int i = 0;i < team.length;i++){ team[i] = this.team[i]; } return team; } /** * * @Description 将指定的员工添加到开发团队中 * @param e * @throws TeamException */ public void addMember(Employee e) throws TeamException{ // 成员已满,无法添加 if(total >= MAX_MEMBER){ throw new TeamException("成员已满,无法添加"); } // 该成员不是开发人员,无法添加 if(!(e instanceof Programmer)){ throw new TeamException("该成员不是开发人员,无法添加"); } // 该员工已在本开发团队中 if(isExist(e)){ throw new TeamException("该员工已在本开发团队中"); } // 该员工已是某团队成员 // 该员正在休假,无法添加 Programmer p = (Programmer)e;//一定不会出现ClassCastException if("BUSY".equalsIgnoreCase(p.getStatus().getNAME())){//if(p.getStatus().getNAME().equals("BUSY")){ throw new TeamException("该员工已是某团队成员"); }else if("VOCATION".equalsIgnoreCase(p.getStatus().getNAME())){ throw new TeamException("该员正在休假,无法添加"); } // 团队中至多只能有一名架构师 // 团队中至多只能有两名设计师 // 团队中至多只能有三名程序员 //获取team已有成员中架构师,设计师,程序员的人数 int numOfArch = 0,numOfDes = 0,numOfPro = 0; for(int i = 0;i < total;i++){ if(team[i] instanceof Architect){ numOfArch++; }else if(team[i] instanceof Designer){ numOfDes++; }else if(team[i] instanceof Programmer){ numOfPro++; } } //正确的 if(p instanceof Architect){ if(numOfArch >= 1){ throw new TeamException("团队中至多只能有一名架构师"); } }else if(p instanceof Designer){ if(numOfDes >= 2){ throw new TeamException("团队中至多只能有两名设计师"); } }else if(p instanceof Programmer){ if(numOfPro >= 3){ throw new TeamException("团队中至多只能有三名程序员"); } } //错误的 // if(p instanceof Architect && numOfArch >= 1){ // throw new TeamException("团队中至多只能有一名架构师"); // }else if(p instanceof Designer && numOfDes >= 2){ // throw new TeamException("团队中至多只能有两名设计师"); // }else if(p instanceof Programmer && numOfPro >= 3){ // throw new TeamException("团队中至多只能有三名程序员"); // } //将p(或e)添加到现有的team中 team[total++] = p; //p的属性赋值 p.setStatus(Status.BUSY); p.setMemberId(counter++); } /** * * @Description 判断指定的员工是否已经存在于现有的开发团队中 * @param e * @return */ private boolean isExist(Employee e) { for(int i = 0;i < total;i++){ return team[i].getId() == e.getId(); } return false; } /** * * @Description 从团队中删除成员 * @param memberId * @throws TeamException */ public void removeMember(int memberId) throws TeamException{ int i = 0; for(;i < total;i++){ if(team[i].getMemberId() == memberId){ team[i].setStatus(Status.FREE); break; } } //未找到指定memberId的情况 if(i == total){ throw new TeamException("找不到指定memberId的员工,删除失败"); } //后一个元素覆盖前一个元素,实现删除操作 for(int j = i + 1;j < total;j++){ team[j - 1] = team[j]; } //写法一: // team[total-1] = null; // total--; //写法二: team[--total] = null; } }
com.atguigu.team.view
TeamView.java
package com.atguigu.team.view; import com.atguigu.team.domain.Employee; import com.atguigu.team.domain.Programmer; import com.atguigu.team.service.NameListService; import com.atguigu.team.service.TeamException; import com.atguigu.team.service.TeamService; public class TeamView { private NameListService listSvc = new NameListService(); private TeamService teamSvc = new TeamService(); public void enterMainMenu(){ boolean loopFlag = true; char menu = 0; while(loopFlag){ if(menu != '1'){ listAllEmployees(); } System.out.print("1-团队列表 2-添加团队成员 3-删除团队成员 4-退出 请选择(1-4):"); menu = TSUtility.readMenuSelection(); switch(menu){ case '1': getTeam(); break; case '2': addMember(); break; case '3': deleteMember(); break; case '4': System.out.print("确认是否退出(Y/N):"); char isExit = TSUtility.readConfirmSelection(); if(isExit == 'Y'){ loopFlag = false; } break; } } } /** * 显示所有的员工信息 * @Description */ private void listAllEmployees(){ // System.out.println("显示公司所有的员工信息"); System.out.println("-------------------------------开发团队调度软件-------------------------------- "); Employee[] employees = listSvc.getAllEmployees(); if(employees == null || employees.length == 0){ System.out.println("公司中没有任何员工信息!"); }else{ System.out.println("ID 姓名 年龄 工资 职位 状态 奖金 股票 领用设备"); for(int i = 0;i < employees.length;i++){ System.out.println(employees[i]); } } System.out.println("-------------------------------------------------------------------------------"); } private void getTeam(){ // System.out.println("查看开发团队情况"); System.out.println("--------------------团队成员列表--------------------- "); Programmer[] team = teamSvc.getTeam(); if(team == null || team.length == 0){ System.out.println("开发团队目前没有成员!"); }else{ System.out.println("TID/ID 姓名 年龄 工资 职位 奖金 股票 "); for(int i = 0;i < team.length;i++){ System.out.println(team[i].getDetailsForTeam()); } } System.out.println("-----------------------------------------------------"); } private void addMember(){ // System.out.println("添加团队成员"); System.out.println("---------------------添加成员---------------------"); System.out.print("请输入要添加的员工ID:"); int id = TSUtility.readInt(); try { Employee emp = listSvc.getEmployee(id); teamSvc.addMember(emp); System.out.println("添加成功"); } catch (TeamException e) { System.out.println("添加失败,原因:" + e.getMessage()); } //按回车键继续... TSUtility.readReturn(); } private void deleteMember(){ // System.out.println("删除团队成员"); System.out.println("---------------------删除成员---------------------"); System.out.print("请输入要删除员工的TID:"); int memberId = TSUtility.readInt(); System.out.print("确认是否删除(Y/N):"); char isDelete = TSUtility.readConfirmSelection(); if(isDelete == 'N'){ return; } try { teamSvc.removeMember(memberId); System.out.println("删除成功"); } catch (TeamException e) { System.out.println("删除失败,原因:" + e.getMessage()); } //按回车键继续... TSUtility.readReturn(); } public static void main(String[] args){ TeamView view = new TeamView(); view.enterMainMenu(); } }
TSUtility.java
package com.atguigu.team.view; import java.util.*; /** * @Description 项目中提供了TSUtility.java类,可用来方便地实现键盘访问。 */ public class TSUtility { private static Scanner scanner = new Scanner(System.in); /** * * @Description 该方法读取键盘,如果用户键入’1’-’4’中的任意字符,则方法返回。返回值为用户键入字符。 */ public static char readMenuSelection() { char c; for (; ; ) { String str = readKeyBoard(1, false); c = str.charAt(0); if (c != '1' && c != '2' && c != '3' && c != '4') { System.out.print("选择错误,请重新输入:"); } else break; } return c; } /** * * @Description 该方法提示并等待,直到用户按回车键后返回。 */ public static void readReturn() { System.out.print("按回车键继续..."); readKeyBoard(100, true); } /** * * @Description 该方法从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。 */ public static int readInt() { int n; for (; ; ) { String str = readKeyBoard(2, false); try { n = Integer.parseInt(str); break; } catch (NumberFormatException e) { System.out.print("数字输入错误,请重新输入:"); } } return n; } /** * * @Description 从键盘读取‘Y’或’N’,并将其作为方法的返回值。 */ public static char readConfirmSelection() { char c; for (; ; ) { String str = readKeyBoard(1, false).toUpperCase(); c = str.charAt(0); if (c == 'Y' || c == 'N') { break; } else { System.out.print("选择错误,请重新输入:"); } } return c; } private static String readKeyBoard(int limit, boolean blankReturn) { String line = ""; while (scanner.hasNextLine()) { line = scanner.nextLine(); if (line.length() == 0) { if (blankReturn) return line; else continue; } if (line.length() < 1 || line.length() > limit) { System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:"); continue; } break; } return line; } }