作者: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