一、
- 数据存储结构不同
ArrayImpl: 使用固定大小的数组 Student[] students
ListImpl: 使用动态数组 ArrayListstudents - 构造函数差异
ArrayImpl: 需要指定初始大小 public StudentDaoArrayImpl(int size)
ListImpl: 无需指定大小,自动扩容 - 添加学生方法的实现
java
// ArrayImpl - 需要遍历查找空位,可能失败
for(int i=0; i<students.length;i++){
if(students[i]==null){
students[i] = student;
success = true;
break;
}
}
return success; // 可能返回false(数组已满)
// ListImpl - 直接添加,总是成功
students.add(student);
return true; // 总是返回true - 查找学生方法的效率
ArrayImpl: 需要检查null值 if(students[i]!= null)
ListImpl: 直接遍历,无需null检查 - 容量限制
ArrayImpl: 有固定容量限制,可能无法添加新学生
ListImpl: 无固定限制,自动扩容 - 内存使用
ArrayImpl: 可能浪费内存(有空位)
ListImpl: 内存使用更高效
二、
这段代码定义了一段接口,实现多态:
// 可以用接口类型引用不同的实现
StudentDao dao1 = new StudentDaoArrayImpl(10);
StudentDao dao2 = new StudenDaoListImpl();
// 调用相同的方法,但执行不同的实现
dao1.addStudent(student);
dao2.addStudent(student);
没有实现代码是因为接口只负责定义规范和声明方法,不包含具体实现。
三、
摘抄:DAO(Data Access Object)模式,在Java编程中,是一种用于隔离应用程序/业务层与持久层(通常是关系型数据库,但也可以是其他持久化机制)的结构模式。它通过一个抽象的API隐藏了所有在底层存储机制中执行CRUD操作的复杂性,使得两层可以独立发展,而不需要彼此了解。
理解:1. 接口作为抽象层
java
public interface StudentDao {
public boolean addStudent(Student student);
public Student getStuByName(String name);
public void diplayAllStudents();
// 通常还有 update 和 delete 方法
}
接口的作用:定义CRUD操作的"契约",但不关心具体实现。
- 实现类处理具体细节
java
// 数组实现
public class StudentDaoArrayImpl implements StudentDao {
private Student[] students;
// 具体的数组操作实现...
}
// List实现
public class StudenDaoListImpl implements StudentDao {
private List
// 具体的List操作实现...
}
// 未来可能的数据库实现
public class StudentDaoDBImpl implements StudentDao {
// 具体的数据库操作...
}
隔离的具体体现
业务层代码(不需要知道存储细节)
java
public class StudentService {
private StudentDao studentDao; // 只依赖接口
public StudentService(StudentDao dao) {this.studentDao = dao; // 注入具体实现
}public void registerStudent(String name, int age) {Student student = new Student(name, age);studentDao.addStudent(student); // 只管调用,不管怎么存
}
}
独立发展的优势
存储方式可以自由变化
java
// 今天用数组
StudentDao dao = new StudentDaoArrayImpl(100);
// 明天用List(业务代码无需修改!)
StudentDao dao = new StudenDaoListImpl();
// 后天用数据库(还是无需修改业务代码!)
StudentDao dao = new StudentDaoDBImpl("jdbc:mysql://...");
两层独立演化
业务层:专注于业务逻辑,不关心数据怎么存
数据层:专注于数据存取优化,不关心业务逻辑
四、
运行与修改说明
原Test.java使用StudentDaoArrayImpl(数组实现),若修改注释切换为StudenDaoListImpl(List实现):
// StudentDao sdm = new StudentDaoArrayImpl(50);
StudentDao sdm = new StudenDaoListImpl();
程序仍可正常运行,输出结果一致(添加3个学生、显示所有学生、查询“Tom”成功)。
DAO模式的好处
解耦业务逻辑与数据存储:Test.java的业务逻辑(添加、查询学生)不依赖具体存储方式(数组/List),仅依赖StudentDao接口。
易于切换数据源:如需将存储方式改为数据库或文件,只需新增一个实现StudentDao的类(如StudentDaoDbImpl),无需修改Test.java的业务代码。
提高可维护性:数据访问逻辑集中在实现类中,修改存储逻辑(如数组扩容规则)不会影响上层业务代码。