5-互评-OO之接口-DAO模式代码阅读及应用

5-互评-OO之接口-DAO模式代码阅读及应用

  1. StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同?
import java.util.ArrayList;
import java.util.List;

public class StudenDaoListImpl implements StudentDao {

	private List<Student> students = new ArrayList<Student>();
	
	@Override
	public Student getStuByName(String name) {
		Student temp = null;
		for(Student e:students){
			if(e.getName().equals(name)){
				temp = e;
			}
		}
		return temp;
	}

	@Override
	public boolean addStudent(Student student) {
		students.add(student);
		return true;
		
	}
	
	@Override
	public void diplayAllStudents(){
		for(Student e:students){
			if (e != null)
				System.out.println(e);
		}
	}

}
public class StudentDaoArrayImpl implements StudentDao {

	private Student[] students;
	
	public StudentDaoArrayImpl(int size) {
		students = new Student[size];
	}

	@Override
	public Student getStuByName(String name) {
		Student temp = null;
		for(int i=0; i<students.length;i++){
			if(students[i]!= null){
				if (students[i].getName().equals(name)){
					temp = students[i];
					break;
				}
			}
		}
		return temp;
		
	}

	@Override
	public boolean addStudent(Student student) {
		boolean success = false;
		for(int i=0; i<students.length;i++){
			if(students[i]==null){
				students[i] = student;
				success = true;
				break;
			}
		}
		return success;
	}
	
	@Override
	public void diplayAllStudents(){
		for(Student e:students){
			if (e != null)
				System.out.println(e);
		}
	}

}
  • StudenDaoListlmpl.java建立了一个Student类型的链表students,使用了ArrayList的动态列表,长度可以灵活变化,故在开头并没有确定该链表的长度是多少。通过动态列表可以通过students.add()很好的添加元素。
  • 而StudenDaoArrayImpl.java 创建了一个Student类型的数组students,需要在一开始就明确好数组的长度。
  1. StudentDao.java文件是干什么用的?为什么里面什么实现代码都没有?
public interface StudentDao {
	public boolean addStudent(Student student);
	public Student getStuByName(String name);
	public void diplayAllStudents();
}
  • StudentDao.java文件主要用来存放方法签名,它定义了数据操作的规范。规范三个代码签名分别为添加学生,通过名字查找学生,展示所有学生,进而在实现类文件分别重新覆写这三个方法,实现动态性。
  1. 使用搜索引擎搜索“Java DAO”,选出几句你能看懂的、对你最有启发的话。请结合接口知识去理解。
  • DAO 模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离对上层提供面向对象的数据访问接口。

  • 理解:实现相同接口的类都有共同的行为,同时接口体现了一种软件之间的交互协议。

  • 隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。

  • 理解:调用者只需要面向接口编程即可,无需考虑方法的具体实现。接口体现了一种高层的抽象。

  1. 尝试运行Test.java。根据注释修改相应代码。结合参考代码回答使用DAO模式有什么好处?

该图是Test.java运行结果
image

根据注释要求存入文件

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// 实现StudentDao接口,用于文件操作
public class FileStudentDao implements StudentDao {
    // 存储学生信息的文件路径
    private static final String FILE_PATH = "D:/students.txt";

    @Override
    public boolean addStudent(Student student) {
        if (student == null || student.getName() == null || student.getName().trim().isEmpty()) {
            return false;
        }

        // 检查学生是否已存在
        if (getStuByName(student.getName()) != null) {
            return false;
        }

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH, true))) {
            // 写入学生姓名(简单存储,实际可根据需要扩展)
            writer.write(student.getName());
            writer.newLine();
            return true;
        } catch (IOException e) {
            System.err.println("添加学生失败:" + e.getMessage());
            return false;
        }
    }

    @Override
    public Student getStuByName(String name) {
        if (name == null || name.trim().isEmpty()) {
            return null;
        }

        try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH))) {
            String line;
            while ((line = reader.readLine()) != null) {
                if (line.trim().equals(name.trim())) {
                    return new Student(line.trim());
                }
            }
        } catch (FileNotFoundException e) {
            // 文件不存在视为没有该学生
            return null;
        } catch (IOException e) {
            System.err.println("查询学生失败:" + e.getMessage());
        }
        return null;
    }

    @Override
    public void diplayAllStudents() {
        List<Student> students = getAllStudents();
        if (students.isEmpty()) {
            System.out.println("没有学生信息");
            return;
        }

        System.out.println("所有学生信息:");
        for (Student student : students) {
            System.out.println(student);
        }
    }

    // 辅助方法:获取所有学生
    private List<Student> getAllStudents() {
        List<Student> students = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH))) {
            String line;
            while ((line = reader.readLine()) != null) {
                if (!line.trim().isEmpty()) {
                    students.add(new Student(line.trim()));
                }
            }
        } catch (FileNotFoundException e) {
            // 文件不存在时返回空列表
        } catch (IOException e) {
            System.err.println("读取学生信息失败:" + e.getMessage());
        }
        return students;
    }

    // 测试方法
    public static void main(String[] args) {
        StudentDao studentDao = new FileStudentDao();

        // 添加学生
        studentDao.addStudent(new Student("张三"));
        studentDao.addStudent(new Student("李四"));

        // 显示所有学生
        studentDao.diplayAllStudents();

        // 查询学生
        Student student = studentDao.getStuByName("张三");
        System.out.println("查询到的学生:" + student);
    }
}
  • 使用Dao模式的好处是可以进行封装,减少代码与代码之间的依赖性。并且实现动态性以及多态。类似接口为调用者提供便利,而不需要调用者知道方法如何实现。

参考视频:5.4 案例:DAO模式

posted @ 2025-10-17 20:43  才知风自由  阅读(3)  评论(0)    收藏  举报