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

5.1 KiB
Raw Blame History

本次实验的主要任务是完成期末案例的业务逻辑层Service Layer开发。业务逻辑层是连接图形界面GUI和数据访问层DAO的桥梁它包含了所有的业务规则和流程控制。

任务一完成DAOFactory

在开始service层开发之前我们需要先完成DAOFactory类。这个类使用了单例模式和工厂模式用于统一管理和获取DAO层的实例。

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实例

// 获取StudentDAO实例
StudentDAO studentDAO = DAOFactory.getStudentDAO();

// 获取TeacherDAO实例
TeacherDAO teacherDAO = DAOFactory.getTeacherDAO();

// 获取LeaveRequestDAO实例
LeaveRequestDAO leaveRequestDAO = DAOFactory.getLeaveRequestDAO();

任务二开发Service层类

src/service目录下创建以下服务类:

2.1 学生服务类StudentService.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

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

任务三创建Service工厂类

为了方便获取Service实例创建一个ServiceFactory类

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 - 测试学生登录功能
  2. TeacherServiceTest.java - 测试教师登录功能
  3. LeaveRequestServiceTest.java - 测试请假申请和审批功能