第八章结束项目

开发团队调度软件






















项目提供类

/**
* @author Heaton
* @date 2018/9/28 0028 22:05
* @describe 提供数据
*/

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"}
    };
}

import java.util.*;
/**
* @author Heaton
* @date 2018/9/28 0028 21:59
* @describe 获取用户输入的数据
*/

public class TSUtility {
    private static Scanner scanner = new Scanner(System.in);

    //要求用户从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;
    }

    //按下回车键才能继续执行
    public static void readReturn() {
        System.out.print("按回车键继续...");
        readKeyBoard(100, true);
    }

    //获取一个int型的数值
    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;
    }

    //从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;
    }
}

项目结构

在domain下建立

public interface Equipment {
	
	String getDescription();
}

public class NoteBook implements Equipment{
	private String model;//机器的型号
	private double price;//价格
	
	public NoteBook() {
		super();
	}

	public NoteBook(String model, double price) {
		super();
		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;
	}

	@Override
	public String getDescription() {
		return model + "(" + price + ")";
	}

}

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 + ")";
	}
	
}

public class Printer implements Equipment{
	private String name;//名称
	private String type;//机器的类型
	
	public Printer() {
		super();
	}

	public Printer(String name, String type) {
		super();
		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;
	}

	@Override
	public String getDescription() {
		return name + "(" + type + ")";
	}

}

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 getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	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 double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	protected String getDetails() {
		return id + "	" + name + "	" + age+ "	" +salary;
	}

	@Override
	public String toString() {
		return getDetails();
	}
}

由于要用到Status,先去创建一个Status
public class Programmer extends Employee{
	private int memberId;//员工号
	private Status status = Status.FREE;
	private Equipment equipment;
	
	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;
	}

}

public class Designer extends Programmer{ private double bonus;//奖金
	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;
	}

}

public class Architect extends Designer{ private int 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;
	}
	
}

在service下创建
//表示员工的状态
public enum Status {
	//空,忙,休假
	FREE,BUSY,VOCATION;
}

/**
* @author Heaton
* @date 2018/9/28 0028 22:28
* @describe 负责将Data.java中的数据装配成具体的Employee对象构成的数组,以及提供针对数组的操作
*/
import static com.tzy.team.service.Data.*;
public class NameListService {

	private Employee[] employees;

	/*
	 * 根据项目提供的Data类构建相应大小的employees数组
	 * 再根据Data类中的数据构建不同的对象,包括Employee、Programmer、Designer和Architect对象,
	 * 以及相关联的Equipment子类的对象. 将对象存于数组中 Data类位于com.tzy.team.service包中
	 */
	public NameListService() {
		employees = new Employee[EMPLOYEES.length];

		for (int i = 0; i < employees.length; i++) {
			// 获取员工的类型,因为要比较一下到底是程序员还是什么
			int type = Integer.parseInt(EMPLOYEES[i][0]);
			// 获取用户的id,name,age,salary
			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]);
			
			//根据type,创建相应类型的对象,并初始化到employees数组中
			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;
			}

		}
	}

	/**
	 * 根据传入的索引,获取指定Data中设备数组中的对象。
	 * 
	 * @param index
	 */
	private Equipment createEquipment(int index) {
		int type = Integer.parseInt(EQUIPMENTS[index][0]);
		String model = EQUIPMENTS[index][1];
		String info = EQUIPMENTS[index][2];
		
		switch (type) {
		case PC:
			return new PC(model, info);	
		case NOTEBOOK:
			double price = Double.parseDouble(info);
			return new NoteBook(model, price);
		case PRINTER:
			
			return new Printer(model, info);
		}
		return null;
	}
	
	//获取所有的员工构成的数组
	public Employee[] getAllEmployees() {
		return employees;
	}
	/**
	 * 
	 * @param id 指定员工的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("找不到指定的员工");
	}

}

public class TeamException extends Exception{
	static final long serialVersionUID = -33875229948L;
	
	public TeamException(){}
	
	public TeamException(String message){
		super(message);
	}
}

在junit包中写个测试吧
public class NameListServiceTest {
        
        @Test
        public void testGetAllEmployees(){
            NameListService listService = new NameListService();
            Employee[] employees = listService.getAllEmployees();
            for (int i = 0; i < employees.length; i++) {
                System.out.println(employees[i]);
            }
        }
    }

那么我们在之前的员工等类中加入方法并重写toString
Employee中

	protected String getDetails() {
		return id + "	" + name + "	" + age+ "	" +salary;
	}

	@Override
	public String toString() {
		return getDetails();
	}

Programmer中

	protected String getMemberDetails() {
		return getMemberId() + "/" + getDetails();
	}

	public String getDetailsForTeam() {
		return getMemberDetails() + "	程序员";
	}

	@Override
	public String toString() {
		return getDetails() + "	程序员	" + status + "					" + equipment.getDescription() ;
	}

Designer中

public String getDetailsForTeam() {
    return getMemberDetails() + "	设计师	" + getBonus();
}

@Override
public String toString() {
    return getDetails() + "	设计师	" + getStatus() + "	" +
           getBonus() +"			" + getEquipment().getDescription();
}

Architect中

public String getDetailsForTeam() {
    return getMemberDetails() + "	架构师	" + 
           getBonus() + "	" + getStock();
}

@Override
public String toString() {
    return getDetails() + "	架构师	" + getStatus() + "	" +
           getBonus() + "	" + getStock() + "	" + getEquipment().getDescription();
}

在测试一下吧

在加一个测试方法

    @Test
    public void testGetAllEmployeeById() throws TeamException {
        NameListService listService = new NameListService();
        int id = 2;
        Employee employee = listService.getEmployee(id);
        System.out.println(employee);
    }

继续写业务service下创建

/** 
* @author Heaton
* @date 2018/9/28 0028 23:09
* @describe 提供开发团队的显示,添加,删除,等操作
*/

public class TeamService {
	
	private static int counter = 1;//用来为开发团队新增成员自动生成团队中的唯一ID
	private final int MAX_MEMBER = 5;//开发团队最多的人员数
	private Programmer[] team = new Programmer[MAX_MEMBER];
	private int total = 0;//用来记录添加到team中开发团队的人数
	
	//返回开发团队人员构成的数组
	public Programmer[] getTeam(){
		Programmer[] team = new Programmer[total];
		for(int i = 0;i < team.length;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("该员工已在本团队中");
		}
		
		//计算出现有的开发团队中程序员、设计师、架构师的人数
		int numOfPro = 0,numOfDes = 0,numOfArch = 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++;
			}
		}
		//判断要添加的p是否满足各个工种人数的要求
                    if (p instanceof Architect && numOfArch >= 1) {
                            throw new TeamException("团队中至多只能有一名架构师");
                    } else if (p instanceof Designer && numOfDes >= 2&&!(p instanceof Architect)) {
                            throw new TeamException("团队中至多只能有两名设计师");
                    } else if (p instanceof Programmer && numOfPro >= 3&&!(p instanceof Architect)&&!(p instanceof Designer)) {
                            throw new TeamException("团队中至多只能有三名程序员");
                    }
		
		//一旦能执行到此位置,证明上述的异常,都不会发生
		p.setStatus(Status.BUSY);
		p.setMemberId(counter++);
		team[total++] = p;
		
	}
	//判断p是否已经存在于当前的开发团队中
	private boolean isExist(Programmer p) {
		for(int i = 0;i < total;i++){
			if(team[i].getId() == p.getId()){
				return true;
			}
		}
		return false;
	}
	//从开发团队中移除指定memberId的员工。
	public void removeMember(int memberId) throws TeamException {
		int i;
		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;j < total - 1;j++){
			team[j] = team[j + 1];
		}
		//方式一:
//		team[total - 1] = null;
//		total--;
		//方式二:
		team[--total] = null;
	}
	
}

最后来个视图view验证下

public class TeamView {
	private NameListService listSvc = new NameListService();
	private TeamService teamSvc = new TeamService();

	public void enterMainMenu() {
		boolean loopFlag = true;
		char key = 0;

		do {
			if (key != '1') {
				listAllEmployees();
			}
			System.out.print("1-团队列表  2-添加团队成员  3-删除团队成员 4-退出   请选择(1-4):");
			key = TSUtility.readMenuSelection();
			System.out.println();
			switch (key) {
			case '1':
				listTeam();
				break;
			case '2':
				addMember();
				break;
			case '3':
				deleteMember();
				break;
			case '4':
				System.out.print("确认是否退出(Y/N):");
				char yn = TSUtility.readConfirmSelection();
				if (yn == 'Y')
					loopFlag = false;
				break;
			}
		} while (loopFlag);
	}

	// 显示所有的员工成员
	private void listAllEmployees() {
		System.out
				.println("
-------------------------------开发团队调度软件--------------------------------
");
		Employee[] emps = listSvc.getAllEmployees();
		if (emps.length == 0) {
			System.out.println("没有客户记录!");
		} else {
			System.out.println("ID	姓名	年龄	工资	职位	状态	奖金	股票	领用设备");
		}

		for (Employee e : emps) {
			System.out.println(" " + e);
		}
		System.out
				.println("-------------------------------------------------------------------------------");
	}

	// 显示开发团队成员列表
	private void listTeam() {
		System.out
				.println("
--------------------团队成员列表---------------------
");
		Programmer[] team = teamSvc.getTeam();
		if (team.length == 0) {
			System.out.println("开发团队目前没有成员!");
		} else {
			System.out.println("TID/ID	姓名	年龄	工资	职位	奖金	股票");
		}

		for (Programmer p : team) {
			System.out.println(" " + p.getDetailsForTeam());
		}
		System.out
				.println("-----------------------------------------------------");
	}

	// 添加成员到团队
	private void addMember() {
		System.out.println("---------------------添加成员---------------------");
		System.out.print("请输入要添加的员工ID:");
		int id = TSUtility.readInt();

		try {
			Employee e = listSvc.getEmployee(id);
			teamSvc.addMember(e);
			System.out.println("添加成功");
		} catch (TeamException e) {
			System.out.println("添加失败,原因:" + e.getMessage());
		}
		// 按回车键继续...
		TSUtility.readReturn();
	}

	// 从团队中删除指定id的成员
	private void deleteMember() {
		System.out.println("---------------------删除成员---------------------");
		System.out.print("请输入要删除员工的TID:");
		int id = TSUtility.readInt();
		System.out.print("确认是否删除(Y/N):");
		char yn = TSUtility.readConfirmSelection();
		if (yn == 'N')
			return;

		try {
			teamSvc.removeMember(id);
			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();
	}
}
原文地址:https://www.cnblogs.com/ttzzyy/p/9721132.html