DAO模式代码阅读及应用
1. StudenDaoListImpl.java 与 StudentDaoArrayImpl.java 的不同
| 对比维度 | StudentDaoArrayImpl |
StudenDaoListImpl |
|---|---|---|
| 底层存储结构 | 使用数组 Student[] 存储,容量固定(初始化时指定) |
使用 ArrayList<Student> 存储,容量动态扩展 |
addStudent 实现 |
遍历数组寻找 null 位置插入,数组满时返回 false |
直接调用 ArrayList.add(),始终返回 true |
getStuByName 实现 |
遍历数组时需判断元素非 null(避免空指针) |
直接遍历集合元素(无需判断 null) |
| 初始化方式 | 需通过构造方法传入数组大小 new StudentDaoArrayImpl(50) |
无需指定容量,直接初始化 new StudenDaoListImpl() |
2. StudentDao.java 的作用及无实现代码的原因
-
作用:
是一个接口,定义了学生数据操作的标准方法(addStudent、getStuByName、diplayAllStudents),统一了所有数据访问实现类的行为规范。 -
无实现代码的原因:
接口仅负责声明方法签名,不提供具体逻辑。具体实现由其实现类(如数组实现、列表实现)根据底层存储方式自行完成,体现“接口定规范,实现类做细节”的设计思想。
3. 结合接口知识理解“Java DAO”
-
“DAO模式通过接口将数据访问逻辑与业务逻辑分离,降低耦合”
例如:Test.java中业务代码仅依赖StudentDao接口,无需关心底层是数组还是列表实现。若未来改用数据库存储,只需新增StudentDaoJdbcImpl实现类,业务代码无需修改。 -
“DAO接口定义数据操作契约,实现类适配不同数据源”
例如:StudentDao定义了“添加、查询、显示”的契约,StudentDaoArrayImpl和StudenDaoListImpl分别适配数组和集合数据源,保证操作方式一致。
4. DAO模式的好处(结合 Test.java)
- 解耦:
Test.java中业务逻辑(循环添加、查询学生)与数据存储逻辑(数组/列表)分离,切换实现类(如注释切换StudentDao实例)时,业务代码无需改动。 - 可扩展:新增数据源(如文件、数据库)时,只需新增
StudentDao实现类,无需修改现有业务代码。 - 规范性:所有实现类遵循
StudentDao接口方法,操作方式统一,降低使用成本。
5. 基于DAO模式的文件存储购物车示例(简化版)
5.1 商品类 Goods.java
public class Goods {
private String id;
private String name;
public Goods(String id, String name) {
this.id = id;
this.name = name;
}
//核心部分
}
5.2 DAO接口 CartDao.java
import java.util.List;
public interface CartDao {
boolean addGoods(Goods goods); // 添加商品
List<Goods> getAllGoods(); // 获取所有商品
}
5.3 文件实现类 CartDaoFileImpl.java
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class CartDaoFileImpl implements CartDao {
private String filePath;
public CartDaoFileImpl(String filePath) {
this.filePath = filePath;
}
@Override
public boolean addGoods(Goods goods) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) {
writer.write(goods.getId() + "," + goods.getName());
writer.newLine();
return true;
} catch (IOException e) {
return false;
}
}
@Override
public List<Goods> getAllGoods() {
List<Goods> goodsList = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split(",");
goodsList.add(new Goods(parts[0], parts[1]));
}
} catch (IOException e) {
e.printStackTrace();
}
return goodsList;
}
}
5.4 测试类 TestCart.java
public class TestCart {
public static void main(String[] args) {
CartDao cartDao = new CartDaoFileImpl("cart.txt");
cartDao.addGoods(new Goods("001", "耳机"));
cartDao.addGoods(new Goods("002", "键盘"));
cartDao.getAllGoods().forEach(System.out::println);
}
}

浙公网安备 33010602011771号