Java基础16
优尚开发团队调度系统
创建项目基本组件
Equipment接口及其实现子类的设计
package domain; public interface Equipment { public String getDescription(); }
package domain; public class NoteBook implements Equipment{ private String model; private double price; @Override public String getDescription() { return model + "(" + price + ")"; } public NoteBook() { } public NoteBook(String model, double price) { this.model = model; this.price = 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; } }
package domain; public class PC implements Equipment{ @Override public String getDescription() { return model + "(" + display + ")"; } private String model; private String display; public PC() { } public PC(String model, String display) { 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; } }
package domain; public class Printer implements Equipment{ private String name; private String type; @Override public String getDescription() { return name + "(" + type + ")"; } public Printer() { } public Printer(String name, String type) { this.name = name; this.type = 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; } }
Employee类及其子类的设计
package service; public enum Status { FREE,BUSY,VOCATION; }
package domain; public class Employee { private int id; private String name; private int age; private double salary; public Employee() { } public Employee(int id, String name, int age, double salary) { this.id = id; this.name = name; this.age = age; this.salary = 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 String getDetails(){ return id + "\t\t" + name + "\t\t\t" + age + "\t\t" + salary + "\t"; } @Override public String toString() { return getDetails(); } }
package domain; import service.Status; public class Programmer extends Employee{ private int memberId; // 开发团队中的ID private Status status = Status.FREE; private Equipment equipment; public Programmer() { } 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() + "\t程序员\t\t" + status + "\t\t\t\t\t\t" + equipment.getDescription(); } protected String getBasicDetailsForteam(){ return memberId +"/" + getId() + "\t\t" + getName() + "\t" + getAge() + "\t\t" + getSalary(); } public String getDetailsForTeam(){ return getBasicDetailsForteam() + "\t程序员"; } }
package domain; public class Designer extends Programmer{ private double bonus; public Designer() { } 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设计师\t\t" + getStatus() + "\t" + bonus+ "\t\t\t\t" + getEquipment().getDescription(); } public String getDetailsForTeam(){ return getBasicDetailsForteam() + "\t设计师" + "\t" + getBonus(); } }
package domain; public class Architect extends Designer{ private int stock; public Architect() { } public Architect(int stock) { this.stock = stock; } 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架构师\t\t" + getStatus() + "\t" + getBonus() + "\t\t" + stock + "\t" + getEquipment().getDescription(); } public String getDetailsForTeam(){ return getBasicDetailsForteam() + "\t架构师" + "\t" + getBonus() + "\t" + getStock(); } }
实现service包中的类
NameListService类的设计
package service; import domain.*; import static service.Data.*; public class NameListService { private Employee[] employees; public NameListService() { // 根据项目提供的Data类构建相应大小的employees数组 employees = new Employee[Data.EMPLOYEES.length]; for (int i = 0; i < employees.length; i ++){ int type = Integer.parseInt(Data.EMPLOYEES[i][0]); 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; int bonus,stock; switch (type){ case Data.EMPLOYEE: employees[i] = new Employee(id,name,age,salary); break; case Data.PROGRAMMER: equipment = creatEquipment(i); employees[i] = new Programmer(id,name,age,salary,equipment); break; case DESIGNER: bonus = Integer.parseInt(EMPLOYEES[i][5]); equipment = creatEquipment(i); employees[i] = new Designer(id,name,age,salary,equipment,bonus); break; case ARCHITECT: bonus = Integer.parseInt(EMPLOYEES[i][5]); stock = Integer.parseInt(EMPLOYEES[i][6]); equipment = creatEquipment(i); employees[i] = new Architect(id,name,age,salary,equipment,bonus,stock); break; } } } public Equipment creatEquipment(int i){ int equipmentType = Integer.parseInt(EQUIPMENTS[i][0]); String model,display,type,name; double price; switch (equipmentType){ case NOTEBOOK: model = EQUIPMENTS[i][1]; price = Double.parseDouble(EQUIPMENTS[i][2]); return new NoteBook(model,price); case PC: model = EQUIPMENTS[i][1]; display = EQUIPMENTS[i][2]; return new PC(model,display); case PRINTER: name = EQUIPMENTS[i][1]; type = EQUIPMENTS[i][2]; return new Printer(name,type); } return null; } public Employee[] getAllEmployees(){ return employees; } public Employee getEmployee(int id) throws TeamException{ for (int i = 0; i < employees.length; i++){ if (id == employees[i].getId()){ return employees[i]; } } throw new TeamException("找不到指定的员工!"); } }
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"} }; //如下的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"} }; }
TeamService类的设计
添加成员:
package service; public class TeamException extends Exception{ static final long serialVersionUID = -33829474775748L; public TeamException(){ } public TeamException(String message) { super(message); } public TeamException(String message, Throwable cause) { super(message, cause); } }
package service; import domain.Architect; import domain.Designer; import domain.Employee; import domain.Programmer; public class TeamService { private int counter = 1; // 用于产生唯一ID private int MAX_MEMBER = 5; private Programmer[] team = new Programmer[MAX_MEMBER]; private int total = 0; // 记录实际人数 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("成员不是开发人员,无法添加!"); } //向下转型 将Employee转型为Programmer Programmer p = (Programmer) e; Status status = p.getStatus(); switch (status){ case BUSY : throw new TeamException("该成员已在某项目团队中,添加失败!"); case VOCATION: throw new TeamException("该成员休假中,添加失败!"); } // 该成员已在团队中 boolean isExit = isExist(p); if(isExit){ throw new TeamException("该成员已在本开发团队中!"); } // 至多一名架构师 至多两名设计师 至多三名程序员 int Arcnum= 0, Pronum = 0, Desnum = 0; for (int i = 0 ; i <total; i ++){ if (team[i] instanceof Architect){ Arcnum ++; }else if (team[i] instanceof Designer){ Desnum ++; }else if (team[i] instanceof Programmer){ Pronum ++; } } if (p instanceof Architect){ if (Arcnum >= 1){ throw new TeamException("已存在一名架构师!添加失败!"); } }else if(p instanceof Designer){ if (Desnum >=2){ throw new TeamException("已存在两名设计师!添加失败!"); } }else if (p instanceof Programmer){ if (Pronum >= 3){ throw new TeamException("已存在三名程序员,添加失败!"); } } /** * 注意这种写法是错误的! * 因为架构师是设计师的子类,设计师是程序员的子类。 * 比如此时我加入一个架构师,且此时Arcnum为0,所以第一个判断不执行,进入到第二个设计师的判断 * 但我的Desnum为2,且架构师属于设计师,所以莫名其妙就抛出了一个存在两名设计师的异常,实际上我添加的是架构师,因此不符合要求 if (e instanceof Architect && Arcnum >= 1){ throw new TeamException("已存在一名架构师!添加失败!"); }else if (e instanceof Designer && Desnum >=2){ throw new TeamException("已存在两名设计师!添加失败!"); } else if (e instanceof Programmer && Pronum >= 3){ throw new TeamException("已存在三名程序员,添加失败!"); } */ // 若代码执行到此位置,说明e是可以添加进来的 team[total++] = p; p.setMemberId(counter++); p.setStatus(Status.BUSY); } 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 i; for (i = 0; i < total; i++){ if (team[i].getId() == memberId){ for(int j = i+1; j < total; j++){ team[j-1] = team[j]; } team[i].setStatus(Status.FREE); //调整数组 team[total-1] = null; total --; } } //没找到这个员工 if (i == total){ throw new TeamException("未找到指定员工!删除失败!"); } } }
视图
package view; import domain.Employee; import domain.Programmer; import service.NameListService; import service.TeamException; import 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.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 isExist=TSUtility.readConfirmSelection(); if(isExist=='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\t\t姓名\t\t\t\t年龄\t\t工资\t\t\t职位\t\t\t状态\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("-----------------团队成员列表----------------"); 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\t职位\t\t奖金\t\t股票\t"); } for(int i=0;i<team.length;i++) { System.out.println(team[i].getDetailsForTeam()); } } private void addMember() { System.out.println("------------------添加成员----------"); System.out.println("请输入要添加的员工ID:"); int id= TSUtility.readInt(); try { Employee emp=listSvc.getEmployee(id); teamSvc.addMember(emp); System.out.println("添加成功"); TSUtility.readReturn();//按回车继续 }catch(TeamException e) { System.out.println("添加失败,原因:"+e.getMessage()); } } private void deleteMember() { System.out.println("------------------删除成员----------"); System.out.println("请输入要删除的员工TID:"); int mebmberid=TSUtility.readInt(); System.out.println("确定要删除?Y/N"); char isDelete=TSUtility.readConfirmSelection(); if(isDelete=='n') { return; } try { teamSvc.removeMember(mebmberid); System.out.println("删除成功"); TSUtility.readReturn();//按回车继续 } catch (TeamException e) { System.out.println("删除失败,原因:"+e.getMessage()); } } public static void main(String[] args) { TeamView view=new TeamView(); view.enterMainMenu(); } }
package view; import java.util.Scanner; 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 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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?