题目要求:

某公司要开发内部的 “办公信息化管理系统”,请使用面向对象的思想描述以下员工信息。

java的管理员环境 java编写管理员类_java的管理员环境


java的管理员环境 java编写管理员类_System_02


java的管理员环境 java编写管理员类_数组_03


办公信息化管理系统实现

  • 一、初级阶段
  • 员工类
  • 部门类
  • 测试类
  • 二、改进阶段
  • 部门类
  • 职务类
  • 员工类
  • 测试类


一、初级阶段

1、构造方法:成员属性:姓名、工号、性别、年龄、所在部门、职务 (程序简单,易于理解)
2、只创建了员工类(Staff)和部门类(Department),再创建测试类

员工类

部门类

姓名、工号、性别、年龄

所在部门、职务

存在的问题:

  1. 没有做到类的单一性原则,只创建了员工类(Staff)和部门类(Department)较为混杂
  2. 将6个属性全部用构造方法来表示,虽然简单,但没有进行类之间的相互联系,如果之后进行修改将不易进行操作

该部分只贴有关思路的代码(不完整),第二阶段改进之后再贴完整的代码

员工类
  1. 声明成员属性–private
public class Staff {
	// 成员属性:姓名、工号、年龄、所在部门、职务
	private String StaffName;
	private String StaffNo;
	private String StaffSex;
	private int StaffAge;
	private String StaffDepartment;
	private String StaffTitle;
	}
  1. 构造方法(实现对姓名、工号、性别、年龄、所在部门、职务的赋值)
// 无参构造
	public Staff() {
	}

	// 多参构造,实现对姓名、工号、性别、年龄、所在部门、职务的赋值
	public Staff(String staffName, String staffNo, String staffSex, int staffAge, String staffDepartment,
			String staffTitle) {
		this.setStaffName(staffName);
		this.setStaffNo(staffNo);
		this.setStaffSex(staffSex);
		this.setStaffAge(staffAge);
		this.setStaffDepartment(staffDepartment);
		this.setStaffTitle(staffTitle);
	}
  1. get/set方法省略,只留下判断(性别、年龄)的相关代码
public void setStaffSex(String staffSex) {
		// 限制性别只能是“男”或者“女”,反之则设置为默认为“男”
		if (staffSex.equals("男") || staffSex.equals("女"))
			this.StaffSex = staffSex;
		else
			this.StaffSex = "男";
	}
/**
	 * 给年龄赋值,限定在18~65之间,反之赋值为18
	 * 
	 * @param staffAge 传入的年龄
	 */
	public void setStaffAge(int staffAge) {
		if (staffAge < 18 || staffAge > 65)
			this.StaffAge = 18;
		else
			this.StaffAge = staffAge;
	}
  1. 介绍员工信息的方法
public String introduction() {
		String str = "员工信息如下:\n姓名:" + this.getStaffName() 
				+ "\n工号:" + this.getStaffNo() + "\n性别:" +  	
				+ this.getStaffSex()+ "\n年龄:" + this.getStaffAge() + 
				+ "\n职务:" + this.getStaffDepartment() + 
				+ this.getStaffTitle();
		return str;
	}
部门类
  1. 声明成员属性–private(创建一个存放人事部,一个存放市场部的两个数组)
public class Department {
	// 成员属性:部门编号、部门名称、员工数组(人事部、市场部)、员工人数
	private String DepartmentNo;
	private String DepartmentName;
	private Staff[] staff_person;
	private Staff[] staff_market;
	private int staffNum_person;
	private int staffNum_market;
	}
  1. 构造方法
//无参构造方法
	public Department() {
	}
	// 多参构造方法:对部门编号、部门名称进行赋值
	public Department(String departmentNo, String departmentName) {
		this.setDepartmentNo(departmentNo);
		this.setDepartmentName(departmentName);
	}
  1. get/set方法部分省略,只留下判断数组(人事部,市场部)是否为空的方法
/**
	 * 获取人事部门中员工的人数,如果保存在人事部的数组未被初始化,创建一个10的数组
	 * 
	 * @param staff_person
	 */
	public Staff[] getStaff_person() {
		if (this.staff_person == null)
			this.staff_person = new Staff[10];
		return staff_person;
/**
	 * 获取市场部门中员工的人数,如果保存在市场部的数组未被初始化,创建一个10的数组
	 * 
	 * @param staff_market
	 */
	public Staff[] getStaff_market() {
		if (this.staff_market == null)
			this.staff_market = new Staff[10];
		return staff_market;
	}
  1. 统计人事部和市场部的人数的方法
public void addStaff(Staff sta) {
		/**
		 * 1、将员工保存在数组中
		 * 2、将员工个数保存在StaffNum_person、StaffNum_market
		 */
		//1、将员工分别保存在人事部、市场部
		if(sta.getStaffDepartment().equals("人事部")) {
			for(int i=0;i<this.getStaff_person().length;i++) {
				if(this.getStaff_person()[i]==null) {
					this.getStaff_person()[i]=sta;
					//2、将人事部的个数保存在StaffNum_person
					this.staffNum_person=i+1;
					return;
				}
			}
		}else {
			for(int i=0;i<this.getStaff_market().length;i++) {
				if(this.getStaff_market()[i]==null) {
					this.getStaff_market()[i]=sta;
					//2、将人事部的个数保存在StaffNum_person
					this.staffNum_market=i+1;
					return;
				}
			}
		}
	}
测试类
package pers.st.company.test;

import pers.st.company.model.Department;
import pers.st.company.model.Staff;

public class CompanyTest {

	public static void main(String[] args) {
		//测试Staff类
		Staff one=new Staff("张铭","S001","男",29,"人事部","经理");
		Staff two=new Staff("李艾爱","S002","女",21,"人事部","助理");
		Staff three=new Staff("孙超","S003","男",29,"人事部","职员");
		Staff four=new Staff("张美美","S004","女",26,"市场部","职员");
		Staff five=new Staff("蓝迪","S005","男",37,"市场部","经理");
		Staff six=new Staff("米莉","S006","女",24,"市场部","职员");
		
		//测试Department类
		Department dep1=new Department();
		
		System.out.println(one.introduction());
		System.out.println("=============================");
		System.out.println(two.introduction());
		System.out.println("=============================");
		System.out.println(three.introduction());
		System.out.println("=============================");
		System.out.println(four.introduction());
		System.out.println("=============================");
		System.out.println(five.introduction());
		System.out.println("=============================");
		System.out.println(six.introduction());
		System.out.println("=============================");
		
		dep1.addStaff(one);
		dep1.addStaff(two);
		dep1.addStaff(three);
		dep1.addStaff(four);
		dep1.addStaff(five);
		dep1.addStaff(six);
		
		System.out.println("人事部总共有"+dep1.getStaffNum_person()+"员工");
		System.out.println("市场部总共有"+dep1.getStaffNum_market()+"员工");	
	}
}

输出结果可能符合要求的,但类之间关联性不强,且修改会存在一定的麻烦和问题

二、改进阶段

程序整体要求

  1. 划分功能模块,根据题目要求设置不同的类,在类中实现相应功能的管理。
  2. 类的标识要清楚易懂,代码结构要层次分明,代码编辑思路要清晰、整洁。
  3. 要求Java代码书写、命名符合规范,属性所属数据类型要准确合理,在代码中添加必要的注释
  4. 程序运行效果与提供的页面效果图、结构保持一致,信息间分隔符“=”号数量不做统一要求,文字大小、颜色也不做统一要求

思路分析:

由场景和运行效果,可以分析出项目中可以抽取如下类(要求编码时注意面向对象思想及封装特性的应用)∶

  • 部门类:
    类型描述:能够描述部门编号、部门名称、员工数组、统计部门中的员工个数
    要求:设定方法统计该部门员工个数
    提示:部门类的属性有四个,分别是部门编号,部门名称,员工数组和统计变量,具体是市场部还是人事部,是通过部门类的对象来表示的,如果是市场部的对象,那么添加并统计的就是市场部的人数,同样如果是人事部的对象,添加并统计的就是人事部的人数
  • 职务类:
    类型描述:能够描述职务编号、职务名称
  • 员工类:
    类型描述:能够描述员工姓名、工号、年龄、性别、所属部门、职务信息要求:
    1、设定方法限定年龄只能是18–65之间,反之则设置默认为18岁
    2、设定方法限定性别只能是“男”或者“女”,反之则设置默认为"男"
    3、设定方法,实现员工自我介绍信息,将员工信息作为字符串返回
  • 测试类:
    类型描述:测试程序,并参照效果图输出结果
    注意:可以在属性上添加适当的信息验证,提高信息的安全性

员工类

部门类

职务类

员工姓名、工号、年龄、性别

部门编号、部门名称、员工数组、统计部门中的员工个数

职务编号、职务名称

java的管理员环境 java编写管理员类_java的管理员环境_04

java的管理员环境 java编写管理员类_数组_05

java的管理员环境 java编写管理员类_数组_06

接下来附上完整代码

部门类
package pers.companyinfo.model;

/**
 * 部门类
 * 
 * @author 11040
 *
 */
public class Department {
	// 成员属性:部门编号、部门名称、员工数组、员工人数
	private String DepartmentNo;
	private String DepartmentName;
	private Staff[] staffs;
	private int staffNum;

	// 无参构造方法
	public Department() {
	}

	// 多参构造方法:对部门编号、部门名称进行赋值
	public Department(String departmentNo, String departmentName) {
		this.setDepartmentNo(departmentNo);
		this.setDepartmentName(departmentName);
	}

	public String getDepartmentNo() {
		return DepartmentNo;
	}

	public void setDepartmentNo(String departmentNo) {
		DepartmentNo = departmentNo;
	}

	public String getDepartmentName() {
		return DepartmentName;
	}

	public void setDepartmentName(String departmentName) {
		DepartmentName = departmentName;
	}

	/**
	 * 获取部门中员工的人数,如果保存在数组中的未被初始化,创建一个100的数组
	 * 
	 * @return
	 */
	public Staff[] getStaffs() {
		if(this.staffs==null) {
			this.staffs=new Staff[100];
		}
		return staffs;
	}

	public void setStaffs(Staff[] staffs) {
		this.staffs = staffs;
	}

	public int getStaffNum() {
		return staffNum;
	}

	public void setStaffNum(int staffNum) {
		this.staffNum = staffNum;
	}

	public void addStaff(Staff sta) {
		/**
		 * 1、将员工保存在数组中 2、将员工个数保存在staffNum
		 */
		// 1、将员工保存在数组中
		int i;
		for (i = 0; i < this.getStaffs().length; i++) {
			if (this.getStaffs()[i] == null) {
				this.getStaffs()[i] = sta;
				break;
			}
		}
		// 2、将员工个数保存在staffNum
		this.staffNum = i + 1;
	}

}
职务类
package pers.companyinfo.model;

/**
 * 职务类
 * 
 * @author 11040
 *
 */
public class Duty {
	// 成员属性:职务编号、职务名称
	private String dutyNo;
	private String dutyName;

	// 无参构造
	public Duty() {

	}

	// 多参构造,实现对职务编号、职务名称的赋值
	public Duty(String dutyNo, String dutyName) {
		this.setDutyNo(dutyNo);
		this.setDutyName(dutyName);
	}

	public String getDutyNo() {
		return dutyNo;
	}

	public void setDutyNo(String dutyNo) {
		this.dutyNo = dutyNo;
	}

	public String getDutyName() {
		return dutyName;
	}

	public void setDutyName(String dutyName) {
		this.dutyName = dutyName;
	}

	

}
员工类
package pers.companyinfo.model;

/**
 * 员工类
 * 
 * @author 11040
 */
public class Staff {
	// 成员属性:姓名、工号、年龄、所在部门、职务
	private String StaffName;
	private String StaffNo;
	private String StaffSex;
	private int StaffAge;
	private Duty staffDuty;
	private Department staffDepart;

	// 无参构造
	public Staff() {

	}

	// 多参构造,实现对姓名、工号、性别、年龄的赋值
	public Staff(String staffName, String staffNo, String staffSex, int staffAge) {
		this.setStaffName(staffName);
		this.setStaffNo(staffNo);
		this.setStaffSex(staffSex);
		this.setStaffAge(staffAge);
	}

	public String getStaffName() {
		return StaffName;
	}

	public void setStaffName(String staffName) {
		StaffName = staffName;
	}

	public String getStaffNo() {
		return StaffNo;
	}

	public void setStaffNo(String staffNo) {
		StaffNo = staffNo;
	}

	public String getStaffSex() {
		return StaffSex;
	}

	public void setStaffSex(String staffSex) {
		// 限制性别只能是“男”或者“女”,反之则设置为默认为“男”
		if (staffSex.equals("男") || staffSex.equals("女"))
			this.StaffSex = staffSex;
		else
			this.StaffSex = "男";
	}

	public int getStaffAge() {
		return StaffAge;
	}

	/**
	 * 给年龄赋值,限定在18~65之间,反之赋值为18
	 * 
	 * @param staffAge 传入的年龄
	 */
	public void setStaffAge(int staffAge) {
		if (staffAge < 18 || staffAge > 65)
			this.StaffAge = 18;
		else
			this.StaffAge = staffAge;
	}

	// 获取专业化对象,如果没有实例化,先实例化再返回
	public Duty getStaffDuty() {
		// 判断其是否实例化
		if (this.staffDuty == null) {
			this.staffDuty = new Duty();
		}
		return staffDuty;
	}

	public void setStaffDuty(Duty staffDuty) {
		this.staffDuty = staffDuty;
	}

	// 获取专业化对象,如果没有实例化,先实例化再返回
	public Department getStaffDepart() {
		if (this.staffDepart == null) {
			this.staffDepart = new Department();
		}
		return staffDepart;
	}

	public void setStaffDepart(Department staffDepart) {
		this.staffDepart = staffDepart;
	}

	public String introduction(Duty staffDuty, Department staffDepart) {
		String str = "员工信息如下:\n姓名:" + this.getStaffName() + "\n工号:" + this.getStaffNo() + "\n性别:" + this.getStaffSex()
				+ "\n年龄:" + this.getStaffAge() + "\n职务:" + staffDepart.getDepartmentName() + staffDuty.getDutyName();
		return str;
	}
}
测试类
package pers.compantinfo.test;

import pers.companyinfo.model.Staff;
import pers.companyinfo.model.Department;
import pers.companyinfo.model.Duty;;

public class test {

	public static void main(String[] args) {
		// 部门类
		Department dpt1 = new Department("D001", "人事部");
		Department dpt2 = new Department("D002", "市场部");
		// 职务类
		Duty duty1 = new Duty("J001", "经理");
		Duty duty2 = new Duty("J002", "助理");
		Duty duty3 = new Duty("J003", "职员");
		// 员工类
		Staff sta1 = new Staff("张铭", "S001", "男", 29);
		Staff sta2 = new Staff("李艾爱", "S002", "女", 21);
		Staff sta3 = new Staff("孙超", "S004", "男", 29);
		Staff sta4 = new Staff("张美美", "S005", "女", 26);
		Staff sta5 = new Staff("蓝迪", "S006", "男", 37);
		Staff sta6 = new Staff("米莉", "S007", "女", 24);

		System.out.println(sta1.introduction(duty1, dpt1));
		System.out.println("=============================");
		System.out.println(sta2.introduction(duty2, dpt1));
		System.out.println("=============================");
		System.out.println(sta3.introduction(duty3, dpt2));
		System.out.println("=============================");
		System.out.println(sta4.introduction(duty1, dpt2));
		System.out.println("=============================");
		System.out.println(sta5.introduction(duty2, dpt2));
		System.out.println("=============================");
		System.out.println(sta6.introduction(duty3, dpt1));
		System.out.println("=============================");

		dpt1.addStaff(sta1);
		dpt1.addStaff(sta2);
		dpt1.addStaff(sta3);
		dpt2.addStaff(sta4);
		dpt2.addStaff(sta5);
		dpt2.addStaff(sta6);
		System.out.println(dpt1.getDepartmentName() + "总共有" + dpt1.getStaffNum() + "名员工");
		System.out.println(dpt2.getDepartmentName() + "总共有" + dpt2.getStaffNum() + "名员工");
	}

}

总结

1、构造方法(全部参数)+ 类(Staff+Department) + 方法(introduction+addStaff):容易理解、参数过长、关联性不强

2、构造方法(基本参数)+ 类(Staff+Department+Duty)+ 方法(introduction+addStaff):通过对象去调用彼此的参数,关联性强并且易于后期的修改