设计模式29 - 数据访问对象模式

作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

数据访问对象模式

数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。

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

UML结构图

在这里插入图片描述

代码实现

student.h
创建数值对象 Student类

#include <string>
using namespace std;

class Student
{
public:
    Student(string name, int rollNo): name(name), rollNo(rollNo) {}

    string getName() { return name; }

    int getRollNo() { return rollNo; }

    void setName(string name) { this->name = name; }

    void setRollNo(int rollNo) { this->rollNo = rollNo; }

private:
    string name;
    int rollNo;
};

interface.h
创建数据访问对象 StudentDaoImpl类,实现对数值对象的增删改查

#include "student.h"
#include <assert.h>
#include <iostream>
#include <vector>

class StudentDao {
public:
    StudentDao() {}
    virtual ~StudentDao() {}

    virtual void getAllStudents () = 0;
    virtual Student * getStudent(int rollNo) = 0;
    virtual void updateStudent(Student *student) = 0;
    virtual void deleteStudent(Student *student) = 0;
};

class StudentDaoImpl: public StudentDao
{
public:
    StudentDaoImpl()
    {
        Student *student1 = new Student("Billy", 0);
        Student *student2 = new Student("Alice", 1);
        Student *student3 = new Student("Kitty", 2);
        Student *student4 = new Student("Ben", 3);
        Student *student5 = new Student("Miss", 4);
        stu.push_back(student1);
        stu.push_back(student2);
        stu.push_back(student3);
        stu.push_back(student4);
        stu.push_back(student5);
    }

    void getAllStudents()
    {
        for (auto it : stu)
        {
            cout << "name: " << it->getName() << ", rollNo: " << it->getRollNo() << endl;
        }
    }

    Student * getStudent(int rollNo)
    {
        for (auto it : stu)
        {
            if (it->getRollNo() == rollNo)
            {
                return it;
            }
        }
        cout << "Student: Roll No " << rollNo << ", is not in database" << endl;
        return nullptr;
    }

    void updateStudent(Student *student)
    {
        for (auto it : stu)
        {
            if (it->getRollNo() == student->getRollNo())
            {
                it->setName(student->getName());
                cout << "Student: Roll No " << student->getRollNo() << ", updated in the database" << endl;
                return;
            }
        }
        cout << "Student: Roll No " << student->getRollNo() << ", is not in database" << endl;
    }

    void deleteStudent(Student *student)
    {
        assert(student != nullptr);
        auto it = std::find(stu.begin(), stu.end(), student);

        if (it == stu.end())
        {
            cout << "Student: name " << student->getName() << ", is not in database" << endl;
        }
        else
        {
            stu.erase(it);
            cout << "Student: Roll No " << student->getRollNo() << ", deleted from database" << endl;
        }
    }

private:
    vector<Student *> stu;
};

main.cpp
实例应用 - 使用 StudentDao 来演示数据访问对象模式的用法

#include "interface.h"

int main()
{
    StudentDao *studentDao = new StudentDaoImpl();
    studentDao->getAllStudents();
    cout << endl;

    Student *student = studentDao->getStudent(4);
    student->setName("Michael");
    studentDao->updateStudent(student);
    studentDao->getAllStudents();
    cout << endl;

    studentDao->deleteStudent(student);
    studentDao->getAllStudents();
    cout << endl;

    student = studentDao->getStudent(5);
    Student *student2 = new Student("Test", 1);
    studentDao->deleteStudent(student2);

    return 0;
}

运行结果:
name: Billy, rollNo: 0
name: Alice, rollNo: 1
name: Kitty, rollNo: 2
name: Ben, rollNo: 3
name: Miss, rollNo: 4

Student: Roll No 4, updated in the database
name: Billy, rollNo: 0
name: Alice, rollNo: 1
name: Kitty, rollNo: 2
name: Ben, rollNo: 3
name: Michael, rollNo: 4

Student: Roll No 4, deleted from database
name: Billy, rollNo: 0
name: Alice, rollNo: 1
name: Kitty, rollNo: 2
name: Ben, rollNo: 3

Student: Roll No 5, is not in database
Student: name Test, is not in database
发布了61 篇原创文章 · 获赞 218 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_34139994/article/details/96590359