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


一、StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同?

  • 存储对象方式不同。DaoListImpl使用ArrayList对学生对象进行存储、DapArrayImpl使用数组进行存储。
  • StudentDaoArrayImpl.java中的addStuden方法有进行查重操作。

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

  • 是一个接口,有关学生操作的一系列方法的声明。
  • 只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为

三、使用搜索引擎搜索“Java DAO”,选出几句你能看懂的、对你最有启发的话。请结合接口知识去理解。

DAO (DataAccessobjects 数据存取对象):是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。
DAO模式需要有三个参与者:

  1. 数据访问对象接口(Data Access Object Interface) - 该接口定义了在一个模型对象上要执行的标准操作。
  2. 数据访问对象实体类(Data Access Object concrete class) 该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库,也可以是 xml,或者是其他的存储机制。
  3. 模型对象/数值对象(Model Object/Value Object) - 该对象是简单的 POJO,包含了 get/set 方法来存储通过使用 DAO 类检索到的数据。

DAO模式通过将接口定义在模型对象上,再在实体类中对接口的方法具体实现。

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

  • 两种数据存储方式运行的结果相同,如下:
    在这里插入图片描述

  • DAO 模式隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用 DAO 方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。

  • 提高代码的复用性:通过将一系列相似的操作提炼并设计出一个接口,使得实现接口的类的特征更为鲜明,使得该类能更灵活地嵌入其他代码中发挥作用;
    利于分工合作:通过将某一操作的具体实现隔离,可以使编写不同部分的程序员专注于自己该做的事情,通过调用对应的接口能更好地进行合作;

  • 组件的替换更为方便:由于操作的具体实现被隔离开来,当该操作的具体实现发生较大改动时,对其他调用该操作的部分毫无影响。无需做大的变动,只需要修改具体实现的部分即可;

  • 提高代码的拓展性:通过 DAO 模式可以向其他部分隐藏细节,这就使得隔离出的部分也能够添加更多的组件来提供更好的服务;

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

import java.io.*;
import java.util.*;

class ShoppingCartItem {
    private int itemId;
    private String name;
    private double price;
    private int quantity;

    public ShoppingCartItem(int itemId, String name, double price, int quantity) {
        this.itemId = itemId;
        this.name = name;
        this.price = price;
        this.quantity = quantity;
    }

    public int getItemId() {
		return itemId;
	}

	public void setItemId(int itemId) {
		this.itemId = itemId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public int getQuantity() {
		return quantity;
	}

	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}

	@Override
    public String toString() {
        return "Item ID: " + itemId + " - Name: " + name + " - Price: " + price + " - Quantity: " + quantity;
    }
}

interface CartDao {
    void addItem(ShoppingCartItem item);
    void removeItem(int itemId);
    List<ShoppingCartItem> getAllItems();
}

class FileCartDao implements CartDao {
    private String filePath;

    public FileCartDao(String filePath) {
        this.filePath = filePath;
    }

    @Override
    public void addItem(ShoppingCartItem item) {
        List<ShoppingCartItem> items = getAllItems();
        items.add(item);
        saveCartData(items);
    }

    @Override
    public void removeItem(int itemId) {
        List<ShoppingCartItem> items = getAllItems();
        items.removeIf(i -> i.getItemId() == itemId);
        saveCartData(items);
    }

    @Override
    public List<ShoppingCartItem> getAllItems() {
        List<ShoppingCartItem> items = new ArrayList<>();

        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] data = line.split(",");
                int itemId = Integer.parseInt(data[0]);
                String name = data[1];
                double price = Double.parseDouble(data[2]);
                int quantity = Integer.parseInt(data[3]);
                ShoppingCartItem item = new ShoppingCartItem(itemId, name, price, quantity);
                items.add(item);
            }
        } catch (FileNotFoundException e) {
            // No data file found, return empty list
        } catch (IOException e) {
            e.printStackTrace();
        }
        return items;
    }

    private void saveCartData(List<ShoppingCartItem> items) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
            for (ShoppingCartItem item : items) {
                String line = item.getItemId() + "," + item.getName() + "," + item.getPrice() + "," + item.getQuantity();
                writer.write(line);
                writer.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class Main {
    public static void main(String[] args) {
        CartDao cartDao = new FileCartDao("cart.txt");

        // Add items to the cart
        ShoppingCartItem item1 = new ShoppingCartItem(1, "Item 1", 10.99, 2);
        ShoppingCartItem item2 = new ShoppingCartItem(2, "Item 2", 5.99, 1);
        cartDao.addItem(item1);
        cartDao.addItem(item2);

        // Print all items in the cart
        List<ShoppingCartItem> items = cartDao.getAllItems();
        for (ShoppingCartItem item : items) {
            System.out.println(item);
        }

        // Remove an item from the cart
        cartDao.removeItem(1);

        // Print all items in the cart after removal
        List<ShoppingCartItem> updatedItems = cartDao.getAllItems();
        for (ShoppingCartItem item : updatedItems) {
            System.out.println(item);
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值