5-互评-OO之接口-DAO模式代码阅读及应用
5-互评-OO之接口-DAO模式代码阅读及应用
- 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,需要在一开始就明确好数组的长度。
- StudentDao.java文件是干什么用的?为什么里面什么实现代码都没有?
public interface StudentDao {
public boolean addStudent(Student student);
public Student getStuByName(String name);
public void diplayAllStudents();
}
- StudentDao.java文件主要用来存放方法签名,它定义了数据操作的规范。规范三个代码签名分别为添加学生,通过名字查找学生,展示所有学生,进而在实现类文件分别重新覆写这三个方法,实现动态性。
- 使用搜索引擎搜索“Java DAO”,选出几句你能看懂的、对你最有启发的话。请结合接口知识去理解。
-
DAO 模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离对上层提供面向对象的数据访问接口。
-
理解:实现相同接口的类都有共同的行为,同时接口体现了一种软件之间的交互协议。
-
隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。
-
理解:调用者只需要面向接口编程即可,无需考虑方法的具体实现。接口体现了一种高层的抽象。
- 尝试运行Test.java。根据注释修改相应代码。结合参考代码回答使用DAO模式有什么好处?
该图是Test.java运行结果
根据注释要求存入文件
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模式