com.zx.team.domain
package com.zx.team.domain; public class Architect extends Designer { 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 Architect() { super(); } private int stock;// 股票 public int getStock() { return stock; } public void setStock(int stock) { this.stock = stock; } @Override public String toString() { return getDetails() + "\t架构师\t" + getStatus() + "\t" + getBonus() + "\t" + stock + "\t" + getEquipment().getDescription(); } @Override public String getDetailsForTeam() { return getTeamBaseDetails() + "\t架构师\t" + getBonus() + "\t" + getStock(); } } package com.zx.team.domain; public class Designer extends Programmer { public Designer(int id, String name, int age, double salary, Equipment equipment, double bonus) { super(id, name, age, salary, equipment); this.bonus = bonus; } public Designer() { super(); } private double bonus;// 奖金 public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } @Override public String toString() { return getDetails() + "\t设计师\t" + getStatus() + "\t" + bonus + "\t\t" + getEquipment().getDescription(); } @Override public String getDetailsForTeam() { return getTeamBaseDetails() + "\t设计师\t" + getBonus(); } } package com.zx.team.domain; public class Employee { private int id; private String name; private int age; private double salary; public int getId() { return id; } public String getName() { return name; } public int getAge() { return age; } public double getSalary() { return salary; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } 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 + "\t" + name + "\t" + age + "\t" + salary; } @Override public String toString() { return getDetails(); } } package com.zx.team.domain; public interface Equipment { String getDescription();// 省略了:public abstract } package com.zx.team.domain; public class NoteBook implements Equipment { private String model;// 机器型号 private double price;// 价格 public String getModel() { return model; } public double getPrice() { return price; } public void setModel(String model) { this.model = model; } 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 + ")"; } } package com.zx.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 String getDisplay() { return display; } public void setModel(String model) { this.model = model; } public void setDisplay(String display) { this.display = display; } @Override public String getDescription() { return model + "(" + display + ")"; } } package com.zx.team.domain; public class Printer implements Equipment { private String name;// 机器型号 private String type;// 机器类型 public String getName() { return name; } public String getType() { return type; } public void setName(String name) { this.name = name; } 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 + ")"; } } package com.zx.team.domain; import com.zx.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 Status getStatus() { return status; } public Equipment getEquipment() { return equipment; } public void setMemberId(int memberId) { this.memberId = memberId; } public void setStatus(Status status) { this.status = status; } public void setEquipment(Equipment equipment) { this.equipment = equipment; } @Override public String toString() { return getDetails() + "\t程序员\t" + status + "\t\t\t" + getEquipment().getDescription(); } public String getTeamBaseDetails() { return memberId + "/" + getId() + "\t" + getName() + "\t" + getAge() + "\t" + getSalary(); } public String getDetailsForTeam() { return getTeamBaseDetails() + "\t程序员"; } }
com.zx.team.service
package com.zx.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: 10, id, name, age, salary // Designer : 10, id, name, age, salary, bonus // Architect : 10, 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" } }; } package com.zx.team.service; //导入此地址下的所有static结构//.*的作用 import static com.zx.team.service.Data.ARCHITECT; import static com.zx.team.service.Data.DESIGNER; import static com.zx.team.service.Data.EMPLOYEE; import static com.zx.team.service.Data.EMPLOYEES; import static com.zx.team.service.Data.EQUIPMENTS; import static com.zx.team.service.Data.NOTEBOOK; import static com.zx.team.service.Data.PC; import static com.zx.team.service.Data.PRINTER; import static com.zx.team.service.Data.PROGRAMMER; import com.zx.team.domain.Architect; import com.zx.team.domain.Designer; import com.zx.team.domain.Employee; import com.zx.team.domain.Equipment; import com.zx.team.domain.NoteBook; import com.zx.team.domain.PC; import com.zx.team.domain.Printer; import com.zx.team.domain.Programmer; /** * @Description 负责将Data中的数据封装到Employee[]数组中,同时提供相关操作Employee[]的方法。 * @author zxdym * @2021年7月7日 */ public class NameListService { private Employee[] employees; /** * 给employees及数组元素进行初始化 */ public NameListService() { // 1.根据项目提供的Data类构建相应大小的employees数组 // 2.再根据Data类中的数据构建不同的对象,包括Employee、Prlgrammer、Designer和Architect对象 // ,以及相关联的Equipment子类的对象 // 3.将对象存于数组中 employees = new Employee[EMPLOYEES.length]; for (int i = 0; i < employees.length; i++) { // 获取员工的类型 int type = Integer.parseInt(EMPLOYEES[i][0]);// String转化为 int:包装类的使用 // 获取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 index * @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("找不到指定的员工"); } } package com.zx.team.service; /** * @Description 表示员工的状态 * @author zxdym * @2021年7月6日 */ 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 com.zx.team.service; /** * @Description 自定义异常类 * @author zxdym * @2021年7月14日 */ public class TeamException extends Exception { static final long serialVersionUID = -33751699329948L; public TeamException() { super(); } public TeamException(String msg) { super(msg); } } package com.zx.team.service; import com.zx.team.domain.Architect; import com.zx.team.domain.Designer; import com.zx.team.domain.Employee; import com.zx.team.domain.Programmer; /** * @Description 关于开发团队成员的管理:添加、删除等。 * @author zxdym * @2021年7月15日 */ 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(); } /** * 获取团队开发中的所有成员 * * @return */ public Programmer[] getTeam() { Programmer[] team = new Programmer[total];// 新建一个数组保存开发团队实际成员 for (int i = 0; i < team.length; i++) { team[i] = this.team[i];// this.team代表全局的数组team } return team; } /** * 将指定的员工添加到开发团队中 * * @param e */ 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;走到这,已经说明是Programmer // 后者增加了空指针异常的风险 if ("BUSY".equals(p.getStatus().getNAME())) {// if(p.getStatus().getNAME().equals("BUSY")) { throw new TeamException("该成员已是某团队成员"); } else if ("VOCATION".equals(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("团队中至多只能有三名程序员"); } } } // 将p(或e)添加到现有的team中 team[total++] = p; // p的属性赋值 p.setStatus(Status.BUSY); p.setMemberId(counter++); } /** * 判断指定的员工是否已经存在于现有的开发团队中 * * @param e * @return */ private boolean isExist(Employee e) { for (int i = 0; i < total; i++) { if (team[i].getId() == e.getId()) { return true; } // return team[i].getId() == e.getId();也行 } return false; } /** * 从团队中删除成员 * * @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.zx.team.view
package com.zx.team.view; /有问题:1.TID/ID没显示全,2.删除团队成员时,删一个,所有的都没了!!!!!!!!!! import com.zx.team.domain.Employee; import com.zx.team.domain.Programmer; import com.zx.team.service.NameListService; import com.zx.team.service.TeamException; import com.zx.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.readConfirmSclection(); if (isExit == 'Y') { loopFlag = false; } break; } } } /** * 显示所有的员工信息 */ private void listAllEmployees() { System.out.println("--------------------------开发团队调度软件-------------------------\n"); Employee[] employees = listSvc.getAllEmployees(); if (employees == null || employees.length == 0) {// 严密的判空方式,以后用这个!!!!!!!!!! System.out.println("公司中没有任何员工信息!"); } else { System.out.println("ID\t姓名\t年龄\t工资\t职位\t状态\t奖金\t股票\t领用设备"); for (int i = 0; i < employees.length; i++) { System.out.println(employees[i]); } } System.out.println("------------------------------------------------------------------------"); } private void getTeam() { System.out.println("------------------------团队成员列表-------------------------------\n"); Programmer[] team = teamSvc.getTeam(); if (team == null || team.length == 0) { System.out.println("开发团队目前没有成员!"); } else { System.out.println("TID/ID\t姓名\t年龄\t工资\t职位\t奖金\t股票\n"); for (int i = 0; i < team.length; i++) { System.out.println(team[i].getDetailsForTeam()); } } System.out.println("-------------------------------------------------------------------"); } private void addMember() { System.out.println("-------------------------添加成员--------------------------------\n"); System.out.print("请输入要添加的员工ID: "); int id = TSUtility.readInt(); try { Employee emp = listSvc.getEmployee(id); teamSvc.addMember(emp); } catch (TeamException e) { System.out.println("添加失败,原因:" + e.getMessage()); } // 按回车键继续。。。 TSUtility.readReturn(); } private void deleteMember() { System.out.println("-------------------------删除成员----------------------------------\n"); System.out.print("请输入要删除员工的TID: "); int memberId = TSUtility.readInt(); System.out.print("确认是否删除(Y/N): "); char isDelete = TSUtility.readConfirmSclection(); 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(); } } package com.zx.team.view; import java.util.Scanner; /** * @Description 项目中提供了TSUtility.java类,可用来方便的实现键盘访问。 * @author zxdym * @2021年7月6日 */ public class TSUtility { private static Scanner scanner = new Scanner(System.in); /** * @Description 该方法读取键盘,如果用户键入‘1’ - ‘4’中的任意字符,则方法返回,返回值为用户 键入字符。 * @return */ 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位的整数,并将其作为方法的返回值。 * @return */ 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’,并将其作为方法的返回值。 * @return */ public static char readConfirmSclection() { 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; } }