DAO模式代码阅读及应用

1. StudenDaoListImpl.javaStudentDaoArrayImpl.java 的不同

对比维度 StudentDaoArrayImpl StudenDaoListImpl
底层存储结构 使用数组 Student[] 存储,容量固定(初始化时指定) 使用 ArrayList<Student> 存储,容量动态扩展
addStudent 实现 遍历数组寻找 null 位置插入,数组满时返回 false 直接调用 ArrayList.add(),始终返回 true
getStuByName 实现 遍历数组时需判断元素非 null(避免空指针) 直接遍历集合元素(无需判断 null
初始化方式 需通过构造方法传入数组大小 new StudentDaoArrayImpl(50) 无需指定容量,直接初始化 new StudenDaoListImpl()

2. StudentDao.java 的作用及无实现代码的原因

  • 作用
    是一个接口,定义了学生数据操作的标准方法(addStudentgetStuByNamediplayAllStudents),统一了所有数据访问实现类的行为规范。

  • 无实现代码的原因
    接口仅负责声明方法签名,不提供具体逻辑。具体实现由其实现类(如数组实现、列表实现)根据底层存储方式自行完成,体现“接口定规范,实现类做细节”的设计思想。

3. 结合接口知识理解“Java DAO”

  • “DAO模式通过接口将数据访问逻辑与业务逻辑分离,降低耦合”
    例如:Test.java 中业务代码仅依赖 StudentDao 接口,无需关心底层是数组还是列表实现。若未来改用数据库存储,只需新增 StudentDaoJdbcImpl 实现类,业务代码无需修改。

  • “DAO接口定义数据操作契约,实现类适配不同数据源”
    例如:StudentDao 定义了“添加、查询、显示”的契约,StudentDaoArrayImplStudenDaoListImpl 分别适配数组和集合数据源,保证操作方式一致。

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);
    }
}
posted @ 2025-10-20 12:47  Jbuckle  阅读(0)  评论(0)    收藏  举报