2024-12-24 09:45:48 +08:00

193 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

本次实验的主要任务是完成期末案例的**业务逻辑层**Service Layer开发。业务逻辑层是连接图形界面GUI和数据访问层DAO的桥梁它包含了所有的业务规则和流程控制。
## 任务一完成DAOFactory
在开始service层开发之前我们需要先完成`DAOFactory`类。这个类使用了单例模式和工厂模式用于统一管理和获取DAO层的实例。
```java
package dao;
import dao.impl.StudentDAOImpl;
import dao.impl.TeacherDAOImpl;
import dao.impl.LeaveRequestDAOImpl;
/**
* DAO工厂类用于获取各种DAO的实例
*/
public class DAOFactory {
private static final StudentDAO studentDAO = new StudentDAOImpl();
private static final TeacherDAO teacherDAO = new TeacherDAOImpl();
private static final LeaveRequestDAO leaveRequestDAO = new LeaveRequestDAOImpl();
/**
* 私有构造函数,防止实例化
*/
private DAOFactory() {
// 私有构造函数,阻止实例化
}
/**
* 获取StudentDAO实例
* @return StudentDAO实例
*/
public static StudentDAO getStudentDAO() {
return studentDAO;
}
/**
* 获取TeacherDAO实例
* @return TeacherDAO实例
*/
public static TeacherDAO getTeacherDAO() {
return teacherDAO;
}
/**
* 获取LeaveRequestDAO实例
* @return LeaveRequestDAO实例
*/
public static LeaveRequestDAO getLeaveRequestDAO() {
return leaveRequestDAO;
}
}
```
`DAOFactory`类的主要特点:
1. 使用私有构造函数防止外部实例化
2. 使用静态字段保存DAO实例确保全局唯一
3. 提供静态方法获取DAO实例
后期你可以这样使用它来获取DAO实例
```java
// 获取StudentDAO实例
StudentDAO studentDAO = DAOFactory.getStudentDAO();
// 获取TeacherDAO实例
TeacherDAO teacherDAO = DAOFactory.getTeacherDAO();
// 获取LeaveRequestDAO实例
LeaveRequestDAO leaveRequestDAO = DAOFactory.getLeaveRequestDAO();
```
## 任务二开发Service层类
`src/service`目录下创建以下服务类:
### 2.1 学生服务类StudentService.java
```java
package service;
import dao.DAOFactory;
import dao.StudentDAO;
import model.Student;
/**
* 学生信息服务类
*/
public class StudentService {
private final StudentDAO studentDAO = DAOFactory.getStudentDAO();
/**
* 根据ID查询学生
* @param id 学生ID
* @return 学生信息
*/
public Student getStudentById(int id) {
return studentDAO.findById(id);
}
/**
* 学生登录
* @param studentId 学号
* @param password 密码
* @return 登录成功返回学生信息失败返回null
*/
public Student login(String studentId, String password) {
Student student = studentDAO.findByStudentId(studentId);
if (student != null && password.equals(student.getPassword())) {
return student;
}
return null;
}
}
```
### 2.2 教师服务类TeacherService.java
```java
package service;
import dao.DAOFactory;
import dao.TeacherDAO;
import model.Teacher;
/**
* 教师信息服务类
*/
public class TeacherService {
private final TeacherDAO teacherDAO = DAOFactory.getTeacherDAO();
/**
* 教师登录
* @param teacherId 教师工号
* @param password 密码
* @return 登录成功返回教师信息失败返回null
*/
public Teacher login(String teacherId, String password) {
Teacher teacher = teacherDAO.findByTeacherId(teacherId);
if (teacher != null && password.equals(teacher.getPassword())) {
return teacher;
}
return null;
}
}
```
### 2.3 请假服务类LeaveRequestService.java
[LeaveRequestService.java](https://static.seahi.me/2024/12/LeaveRequestService.java)
## 任务三创建Service工厂类
为了方便获取Service实例创建一个ServiceFactory类
```java
package service;
/**
* Service工厂类用于获取各种Service的实例
*/
public class ServiceFactory {
private static final StudentService studentService = new StudentService();
private static final TeacherService teacherService = new TeacherService();
private static final LeaveRequestService leaveRequestService = new LeaveRequestService();
private ServiceFactory() {
// 私有构造函数,防止实例化
}
public static StudentService getStudentService() {
return studentService;
}
public static TeacherService getTeacherService() {
return teacherService;
}
public static LeaveRequestService getLeaveRequestService() {
return leaveRequestService;
}
}
```
## 任务四:单元测试
`test/service`目录下创建对应的测试类:
1. [StudentServiceTest.java](https://static.seahi.me/2024/12/StudentServiceTest.java) - 测试学生登录功能
2. [TeacherServiceTest.java](https://static.seahi.me/2024/12/TeacherServiceTest.java) - 测试教师登录功能
3. [LeaveRequestServiceTest.java](https://static.seahi.me/2024/12/LeaveRequestServiceTest.java) - 测试请假申请和审批功能