数据访问对象模式(Data Access Object Pattern,简称DAO模式)是一种用于将数据存取和业务逻辑分离的设计模式。它提供了一种抽象接口,使应用程序能够访问各种数据存储方式(如数据库、文件系统等)的数据,而不暴露底层实现的细节。

DAO 模式的主要目标是将数据存取与业务逻辑解耦,使得数据的访问和操纵可以在不同的实现间切换,而不影响业务逻辑。这种分离有助于提高代码的可维护性、可测试性和可扩展性。

以下是 DAO 模式中的一些关键组件:

1. 数据访问对象接口(DAO Interface): 定义了对数据进行访问和操作的通用接口,包括增、删、改、查等操作。

2. 具体数据访问对象(Concrete DAO): 实现了数据访问对象接口,负责实际的数据存取和操作。具体数据访问对象可以针对不同的数据存储方式(如数据库)有不同的实现。

3. 数据传输对象(Data Transfer Object,DTO): 用于传输数据的对象,通常是一个简单的POJO(Plain Old Java Object),包含了数据的字段和对应的 getter 和 setter 方法。

4. 数据源(Data Source): 提供了访问底层数据存储的机制,可以是数据库、文件系统或其他数据存储方式。

下面是一个简单的 Java 示例:
// 数据传输对象
class Student {
    private String name;
    private int rollNo;

    public Student(String name, int rollNo) {
        this.name = name;
        this.rollNo = rollNo;
    }

    // 省略 getter 和 setter 方法
}

// 数据访问对象接口
interface StudentDAO {
    Student getStudent(int rollNo);
    void updateStudent(Student student);
    void deleteStudent(Student student);
    List<Student> getAllStudents();
}

// 具体数据访问对象
class StudentDAOImpl implements StudentDAO {
    // 实际的数据存储可以是数据库、文件等
    private List<Student> students;

    public StudentDAOImpl() {
        students = new ArrayList<>();
        students.add(new Student("John", 1));
        students.add(new Student("Jane", 2));
    }

    @Override
    public Student getStudent(int rollNo) {
        return students.stream()
            .filter(s -> s.getRollNo() == rollNo)
            .findFirst()
            .orElse(null);
    }

    @Override
    public void updateStudent(Student student) {
        Student existingStudent = getStudent(student.getRollNo());
        if (existingStudent != null) {
            existingStudent.setName(student.getName());
        }
    }

    @Override
    public void deleteStudent(Student student) {
        students.remove(student);
    }

    @Override
    public List<Student> getAllStudents() {
        return new ArrayList<>(students);
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        StudentDAO studentDAO = new StudentDAOImpl();

        // 获取学生信息
        Student student = studentDAO.getStudent(1);
        System.out.println("Student: " + student.getName());

        // 更新学生信息
        student.setName("Updated John");
        studentDAO.updateStudent(student);

        // 删除学生信息
        studentDAO.deleteStudent(student);

        // 获取所有学生信息
        List<Student> allStudents = studentDAO.getAllStudents();
        System.out.println("All Students: " + allStudents);
    }
}

在这个示例中,StudentDAO是数据访问对象接口,StudentDAOImpl是具体数据访问对象的实现。通过这个模式,客户端可以通过调用StudentDAO接口的方法来访问和操作学生数据,而不需要知道实际的数据存储细节。这种分层的设计使得业务逻辑和数据存储的实现可以相对独立地变化。


转载请注明出处:http://www.zyzy.cn/article/detail/11866/设计模式