当前位置: 首页 > news >正文

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

1. StudenDaoListImpl.java 与 StudentDaoArrayImpl.java 有何不同?

这两个类都实现了 StudentDao 接口,但它们内部用来存储学生对象的数据结构管理逻辑完全不同:

  • StudenDaoListImpl (基于List的实现):

    • 底层数据结构: 使用 ArrayList<Student>
    • 容量: 动态增长,无需指定初始大小。添加元素时,如果容量不足,它会自动扩容。
    • 添加逻辑: addStudent 方法直接调用 list.add(student),几乎总是成功(除非内存耗尽)。
    • 查找逻辑: 使用增强for循环遍历列表。
  • StudentDaoArrayImpl (基于数组的实现):

    • 底层数据结构: 使用固定大小的 Student[] 数组。
    • 容量: 在构造对象时必须指定数组大小,容量是固定的。
    • 添加逻辑: addStudent 方法需要遍历数组,找到第一个为 null 的空位来放入学生对象。如果数组已满,添加就会失败。
    • 查找逻辑: 使用标准for循环遍历数组,并且需要额外检查元素是否为 null

核心区别总结: 它们对数据的存储和管理方式不同,但对外却提供了完全相同的一组操作(由接口定义)。

2. StudentDao.java文件是干什么用的?为什么里面什么实现代码都没有?

StudentDao.java 文件定义了一个 接口

  • 它的作用: 它充当了一份契约规范。它不关心数据具体是如何存储和实现的,只规定了“对于一个学生数据访问对象,必须提供哪些功能”。在这里,它规定了必须有 addStudent(添加学生)、getStuByName(按姓名查询)和 diplayAllStudents(显示所有学生)这三个方法。
  • 为什么没有实现代码: 这正是接口的核心思想——分离“做什么”和“怎么做”
    • 接口只声明“做什么” (What to do):它定义了方法签名(方法名、参数、返回类型),但不包含方法体。
    • 实现类负责“怎么做” (How to do):StudenDaoListImplStudentDaoArrayImpl 这些具体的实现类,负责用各自的方式(用List或用数组)去实现接口中声明的每一个方法。

这种分离使得上层代码(如 Test 类)只需要面向接口编程,而不需要依赖具体的实现,极大地提高了代码的灵活性和可维护性。

3. 使用搜索引擎搜索“Java DAO”,选出几句你能看懂的、对你最有启发的话。

  • 启发1: "DAO模式将低级数据访问逻辑与高级业务逻辑分离开来。"
    • 结合接口的理解: 接口 (StudentDao) 代表了“高级业务逻辑”需要的数据访问操作,而实现类 (StudenDaoListImpl等) 则包含了“低级”的、与特定存储介质(如List, Array, 数据库)打交道的代码。
  • 启发2: "它通过抽象和封装来提供对数据源的透明访问。"
    • 结合接口的理解: “抽象”指的就是接口。业务层不需要知道数据是存在数组、List还是数据库里(透明访问),它只需要和接口交互。实现类的变化不会影响业务层。
  • 启发3: "使用DAO模式使得应用程序更容易在不修改代码的情况下切换底层持久化机制。"
    • 结合接口的理解: 这正是您 Test.java 代码所演示的。只需将 sdm 的实例化从 new StudentDaoArrayImpl(50) 改为 new StudenDaoListImpl(),整个程序的底层数据存储就从数组切换到了List,而 Test 类中的其他代码一行都不用改。

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

运行与修改: 代码可以成功运行。根据注释,将 Test.java 中的:

StudentDao sdm = new StudentDaoArrayImpl(50); //使用数组实现

修改为:

StudentDao sdm = new StudenDaoListImpl(); //使用列表实现

程序依然能正常运行,并产生正确的结果。

DAO模式的好处:

  1. 解耦和灵活性: 这是最大的好处。业务逻辑(Test 类)与数据访问细节完全分离。想要更换数据存储方式(从数组到List,甚至未来到数据库或文件),只需更换一个具体的DAO实现类即可,业务代码无需任何改动。
  2. 可维护性: 数据访问逻辑被集中在了DAO层。如果数据存储方式需要优化或修复Bug,只需要修改对应的DAO实现类,不会影响到其他部分的代码。
  3. 可测试性: 在测试业务逻辑时,可以创建一个“模拟”的DAO实现(Mock Implementation),而不需要连接真实的数据源,使得单元测试更加简单和独立。

5. 可选:编写一些使用DAO模式的代码。比如使用文件作为购物车存储底层。

以下是一个使用文件作为存储底层的购物车DAO模式的简单示例:

1. 商品类 (Item.java)

public class Item {private String id;private String name;private double price;// 构造函数、Getter/Setter、toString() 略public Item(String id, String name, double price) {this.id = id;this.name = name;this.price = price;}// ... getters and toString ...
}

2. 购物车DAO接口 (ShoppingCartDao.java)

import java.util.List;public interface ShoppingCartDao {boolean addItem(Item item);boolean removeItem(String itemId);List<Item> getAllItems();void saveToFile(); // 显式保存到文件void loadFromFile(); // 从文件加载
}

3. 基于文件的DAO实现 (ShoppingCartDaoFileImpl.java)

import java.io.*;
import java.util.ArrayList;
import java.util.List;public class ShoppingCartDaoFileImpl implements ShoppingCartDao {private List<Item> cartItems = new ArrayList<>();private String fileName;public ShoppingCartDaoFileImpl(String fileName) {this.fileName = fileName;loadFromFile(); // 构造时从文件加载现有数据}@Overridepublic boolean addItem(Item item) {cartItems.add(item);saveToFile(); // 添加后立即保存return true;}@Overridepublic boolean removeItem(String itemId) {// 遍历查找并删除for (Item item : cartItems) {if (item.getId().equals(itemId)) {cartItems.remove(item);saveToFile(); // 删除后立即保存return true;}}return false;}@Overridepublic List<Item> getAllItems() {return new ArrayList<>(cartItems); // 返回副本}@Overridepublic void saveToFile() {// 使用序列化将整个列表写入文件try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName))) {oos.writeObject(cartItems);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void loadFromFile() {File file = new File(fileName);if (file.exists()) {try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName))) {cartItems = (List<Item>) ois.readObject();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}}
}

4. 测试类 (TestShoppingCart.java)

public class TestShoppingCart {public static void main(String[] args) {// 使用文件实现的购物车ShoppingCartDao cartDao = new ShoppingCartDaoFileImpl("cart.data");// 添加商品cartDao.addItem(new Item("1", "Apple", 5.0));cartDao.addItem(new Item("2", "Book", 15.5));// 显示所有商品System.out.println("All items in cart:");for (Item item : cartDao.getAllItems()) {System.out.println(item);}}
}
http://www.hskmm.com/?act=detail&tid=32629

相关文章:

  • [Paper Reading] VLM2VEC: TRAINING VISION-LANGUAGE MODELS FOR MASSIVE MULTIMODAL EMBEDDING TASKS
  • Index of /ubuntu-cdimage/ubuntukylin/releases/
  • ubuntu安装和设置为图形界面或命令行界面
  • 10.16日学习笔记
  • day 3
  • PWN手的成长之路-18-ciscn_2019_ne_5-rettext
  • 技术人不用当“兼职运营”:2025微信编辑器实用指南,让产品更新日志/API教程产出效率提升3倍
  • 站位1
  • ubuntu2204系统ip地址配置
  • 10.16 —— 2021ccpc桂林D,B
  • day 2
  • 日志分析-windows日志分析base
  • 2025/10/16 模拟赛笔记 - sb
  • 课后作业3
  • KMP和Manacher
  • 10月16日日记
  • 日志|二叉树|404左叶子之和|112路径总和|129求根节点到叶子节点数字之和|
  • 第 5 天:C 语言运算符与表达式 —— 数据处理的优秀的工具集
  • mongoDB体验
  • TELUS如何通过Google技术栈实现业务增长与生产力跃升
  • 云服务器上部署 EasyTier中转服务器
  • 问世界
  • 为 .NET 10 GC(DATAS)做准备
  • LLM学习记录DAY3
  • 日总结 13
  • 黄景行电脑软件
  • 开源许可协议 gpl vs mit?
  • 二进制警报器
  • 题解:P8019 [ONTAK2015] OR-XOR
  • DP 思维好题(转载)