package view; import domain.Employee; import domain.Programer; import service.NameListService; import service.TeamException; import service.TeamService; public class TeamView { private NameListService listService = new NameListService(); private TeamService teamService = new TeamService(); public void enterMainMenu() { boolean loopFlag = true; char menu = 0; do { if (menu != '1'){ listAllEmployees(); } System.out.println("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.println("确认是否要退出(Y/N)"); char isExit = TSUtility.readConfirmSelection(); if (isExit == 'Y'){ loopFlag= false; } break; } }while (loopFlag) ; } //显示所有的员工信息 private void listAllEmployees () { System.out.println("\n-------------------------------开发团队调度软件--------------------------------\n"); Employee[] employee= listService.getAllEmployees(); System.out.println("ID\t\t姓名\t\t年龄\t\t工资\t\t职位\t\t状态\t\t奖金\t\t股票\t\t领用设备"); for (int i =0 ; i < employee.length;i++){ System.out.println(employee[i]); } } private void getTeam () { System.out.println("\n--------------------团队成员列表---------------------\n"); Programer[] team = teamService.getTeam(); if (team == null || team.length==0){ System.out.println("开发团队目前没有成员"); }else{ System.out.println("TID/ID\t姓名\t年龄\t工资\t职位\t奖金\t股票"); for (int i =0;i< team.length;i++){ System.out.println(team[i].getDetailForTeam()); } } System.out.println("-----------------------------------------------------"); } private void addMember () { System.out.println("---------------------添加成员----------------------"); System.out.println("请输入要添加的成员的Id"); int id = TSUtility.readInt(); try { teamService.addMember(listService.getEmployee(id)); System.out.println("添加成功"); TSUtility.readReturn(); } catch (TeamException e) { System.out.println("添加失败: 原因" + e.getMessage()); } } private void deleteMember () { System.out.println("------------------删除员工-----------------"); System.out.println("请输入要删除的团队的TID"); int memberId = TSUtility.readInt(); System.out.println("确认是否删除Y/N"); char isDelete = TSUtility.readConfirmSelection(); if (isDelete =='N'){ return; }else if (isDelete == 'Y'){ try { teamService.removeMember(memberId); System.out.println("删除成功"); } catch (TeamException e) { System.out.println("删除失败 原因:"+e.getMessage()); } TSUtility.readReturn(); } } public static void main (String[]args){ TeamView teamView = new TeamView(); teamView.enterMainMenu(); } }
package view; import java.util.*; public class TSUtility { private static Scanner scanner = new Scanner(System.in); 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; } public static void readReturn() { System.out.print("按回车键继续..."); readKeyBoard(100, true); } 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; } 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; } }
package 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"} }; //如下的EQIPMENTS数组与上面的EMPLOYEES数组元素一一对应 //PC :21, model, display //NoteBook:22, model, price //Printer :23, type, name public static final String[][] EQIPMENTS = { {}, {"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"} }; }
package service; import domain.*; /** * 负责将Data中的数据封装到Empoyee[]数组中,同时提供相关操作Employee[]的方法 */ public class NameListService { private Employee[] employees; //给数组及其数组元素进行初始化 public NameListService() { //根据项目提供的Data类构建相应大小的employees数组 //在根据Data类中的数据构建不同的对象,包括Employee,Programer,Designer,Architect对象, //以及相关联的Equipment子类对象 . 最后将对象存于数据中 employees = new Employee[Data.EMPLOYEES.length];//开辟数组 for (int i=0;i <employees.length;i++){ //获取员工的类型 int type = Integer.parseInt(Data.EMPLOYEES[i][0]); //获取Employee的4个基本信息 int id = Integer.parseInt(Data.EMPLOYEES[i][1]); String name = Data.EMPLOYEES[i][2]; int age =Integer.parseInt( Data.EMPLOYEES[i][3]); double salary = Double.parseDouble(Data.EMPLOYEES[i][4]); Equipment equipment; double bonus; int stock; switch (type){ case Data.EMPLOYEE : employees[i] = new Employee(id,name,age,salary); break; case Data.PROGRAMMER: equipment = createEquipment(i); employees[i] = new Programer(id,name,age,salary,equipment); break; case Data.DESIGNER: equipment = createEquipment(i); bonus = Double.parseDouble( Data.EMPLOYEES[i][5]) ; employees[i] = new Designer(id,name,age,salary,equipment,bonus); break; case Data.ARCHITECT: equipment = createEquipment(i); bonus = Double.parseDouble( Data.EMPLOYEES[i][5]) ; stock = Integer.parseInt(Data.EMPLOYEES[i][6]); employees[i] = new Architect(id,name,age,salary,equipment,bonus,stock); break; } } } public Employee[] getEmployees(){ return null; } public Employee getEmployee(){ return null; } //获取当前所有的员工 public Employee[] getAllEmployees(){ return employees; } //获取指定ID的员工 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("找不到指定的员工"); } //获取指定index位置上员工的设备 private Equipment createEquipment(int index){ int type = Integer.parseInt(Data.EQIPMENTS[index][0]) ; switch (type){ case Data.PC://21 return new PC(Data.EQIPMENTS[index][1],Data.EQIPMENTS[index][2]); case Data.NOTEBOOK: return new Notebook(Data.EQIPMENTS[index][1], Double.parseDouble(Data.EQIPMENTS[index][2])); case Data.PRINTER: return new printer(Data.EQIPMENTS[index][1],Data.EQIPMENTS[index][2]); } return null; } }
package 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 BUSY = new Status("BUSY"); public static final Status VOCATION = new Status("VOCATION"); public String getNAME() { return NAME; } @Override public String toString() { return NAME; } }
package service; //自定义异常类 public class TeamException extends Exception{ static final long serialVersionUID = -3387514229948L; public TeamException(){ super(); } public TeamException(String msg){ super(msg); } }
package service; import domain.Architect; import domain.Designer; import domain.Employee; import domain.Programer; /** * 关于开发团队的成员的管理 添加 删除 */ public class TeamService { private static int counter = 1;//用于给memberId赋值 private final int MAX_MEMBER = 5;//限制开发团队的最大人数 private Programer[] team = new Programer[MAX_MEMBER];//保存开发团队成员 private int total;//记录开发团队中实际的人数 /** * 获取开发团队中的所有成员 */ public Programer[] getTeam() { Programer[] team = new Programer[total]; for (int i = 0; i < team.length; i++) { team[i] = this.team[i]; } return team; } /** * 判断指定的员工是否在开发团队中 * * @param employee * @return */ private boolean isExit(Employee employee) { for (int i = 0; i < total; i++) { if (team[i].getId() == employee.getId()) { return true; } } return false; } /** * 从团队当中删除成员 * * @param memberId */ public void removeMember(int memberId) throws TeamException { int i=0; for (i=0; i < total; i++) { if (team[i].getMemberId() == memberId) { team[i].setStatus(Status.FREE); break; } } 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 --; } /** * 将指定的员工添加到开发团队中 * * @param e */ public void addMember(Employee e) throws TeamException { //成员已满 无法添加 if (total >= MAX_MEMBER) { throw new TeamException("成员已满 无法添加"); } //该成员不是开发人员 无法添加 if (!(e instanceof Programer)) { throw new TeamException("该成员不是开发人员 无法添加"); } //该员工已在本开发团队中 if (isExit(e)) { throw new TeamException("该员工已在本开发团队中"); } //该员工已是某团队成员 //该员工正在休假 无法添加 Programer p = (Programer) e; if (p.getStatus().getNAME().equals("BUSY")) { throw new TeamException("该员工已是某团队成员"); } else if ("VOCATION".equals(p.getStatus().getNAME())) { throw new TeamException("该员工正在休假 无法添加"); } //团队中至多只能有一名架构师 //团队中至多只能有两名设计师 //团队中只能有三名程序员 //先获取已有成员中架构师 设计师 程序员的 人数 int numberOfArh = 0, numberOfDes = 0, numberOfPro = 0; for (int i = 0; i < total; i++) { if (team[i] instanceof Architect) { numberOfArh++; } else if (team[i] instanceof Designer) { numberOfDes++; } else if (team[i] instanceof Programer) { numberOfPro++; } } if (p instanceof Architect) { if (numberOfArh >= 1) { throw new TeamException("团队中至多只能有一名架构师"); } else if (numberOfDes >= 2) { throw new TeamException("团队中至多只能有两名设计师"); } else if (numberOfPro >= 3) { throw new TeamException("团队中只能有三名程序员"); } } //没有异常 p(e)可以进行添加 将p(e)添加到现有的team中 team[total] = p; total++; //P的属性的一个赋值 p.setMemberId(counter); counter++; p.setStatus(Status.BUSY); } }
package 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() + "架构师" + "\t" + getStatus() + "\t" + getBonus() + "\t" + stock + "\t" + getEquipment().getDescription(); } public String getDetailForTeam() { return getMemberDetails() + "\t架构师\t" + getBonus() + "\t" + getStock(); } }
package domain; //设计师子类 public class Designer extends Programer { 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() + "设计师" + "\t" + getStatus() + "\t" + bonus + " \t\t" + getEquipment().getDescription(); } public String getDetailForTeam(){ return getMemberDetails() + "\t设计师\t" + getBonus() ; } }
package domain; //员工类 public class Employee { private int id; private String name; private int age; private double salary; public Employee(int id, String name, int age, double salary) { this.id = id; this.name = name; this.age = age; this.salary = salary; } public Employee() { super(); } 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 String getDetails() { return "id=" + id + "\t" + " name=" + name + "\t" + ",age=" + age + "\t" + " salary=" + salary + "\t"; } @Override public String toString() { return getDetails(); } }
package domain; public interface Equipment { public abstract String getDescription(); }
package domain; public class Notebook implements Equipment{ private String model;//机器型号 private double price;//价格 public Notebook(String model,double price) { this.price = price; this.model = model; } public Notebook() { super(); } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getModel() { return model; } public void setModel(String model) { this.model = model; } @Override public String getDescription() { return model + price; } }
package domain; public class PC implements Equipment { private String model, display; //机器型号和显示器名称 public PC(String model, String display) { super(); this.model = model; this.display = display; } public PC() { super(); } 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; } }
package domain; public class printer implements Equipment { private String name;//机器型号 private String type;//机器类型 public printer(String type, String name) { super(); this.name = name; this.type = type; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String getDescription() { return name + type; } }
package domain; import service.Status; //程序员子类 public class Programer extends Employee { private int memberId;//开发团队中的id private Equipment equipment; private Status status = Status.FREE;//状态 public Programer(int id, String name, int age, double salary, Equipment equipment) { super(id, name, age, salary); this.equipment = equipment; } public Programer() { super(); } public int getMemberId() { return memberId; } public void setMemberId(int memberId) { this.memberId = memberId; } public Equipment getEquipment() { return equipment; } public void setEquipment(Equipment equipment) { this.equipment = equipment; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } @Override public String toString() { return getDetails() + "程序员" + "\t" + status + "\t\t\t\t " + equipment.getDescription() ; } protected String getMemberDetails() { return getMemberId() + "/" + getDetails(); } public String getDetailForTeam(){ return getMemberDetails() + "\t程序员\t" ; } }