数据访问对象模式
数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。
参与者
1、数据访问对象接口(Data Access Object Interface) - 该接口定义了在一个模型对象上要执行的标准操作。
2、数据访问对象实体类(Data Access Object concrete class) - 该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库,也可以是 xml,或者是其他的存储机制。
3、模型对象/数值对象(Model Object/Value Object) - 该对象是简单的 POJO,包含了 get/set 方法来存储通过使用 DAO 类检索到的数据。
采用菜鸟教程的例子,这里用C++实现
#include<iostream>
#include<string>
#include<algorithm>
#include<list>
using namespace std;
//模型对象类Student
class Student
{
public:
Student(string name,int rollNo);
~Student() {};
string getName();
void setName(string name);
int getRollNo();
void setRollNo(int rollNo);
private:
string name;
int rollNo;
};
Student::Student(string name, int rollNo)
{
this->name = name;
this->rollNo = rollNo;
}
string Student::getName()
{
return this->name;
}
void Student::setName(string name)
{
this->name = name;
}
int Student::getRollNo()
{
return this->rollNo;
}
void Student::setRollNo(int rollNo)
{
this->rollNo = rollNo;
}
//数据访问接口抽象类StudentDao
class StudentDao
{
public:
StudentDao() {};
~StudentDao() {};
virtual list<Student*> getAllStudents()=0;
virtual Student* getStudent(int rollNo) = 0;
virtual void updateStudent(Student *st1) = 0;
virtual void deleteStudent(Student *st1) = 0;
};
//数据访问对象实体类StudentDaoImpl
class StudentDaoImpl : public StudentDao
{
public:
StudentDaoImpl();
~StudentDaoImpl();
list<Student*> getAllStudents();
Student* getStudent(int rollNo);
void updateStudent(Student *st1);
void deleteStudent(Student *st1);
private:
list<Student*> students;
};
StudentDaoImpl::StudentDaoImpl()
{
Student *s1 = new Student("Robert", 0);
Student *s2 = new Student("Jhon", 1);
this->students.push_back(s1);
this->students.push_back(s2);
}
StudentDaoImpl::~StudentDaoImpl()
{
list<Student*>::iterator it;
for (it = this->students.begin(); it != this->students.end(); ++it)
{
delete (*it);
(*it) = NULL;
}
}
list<Student*> StudentDaoImpl::getAllStudents()
{
return students;
}
Student* StudentDaoImpl::getStudent(int rollNo)
{
list<Student*>::iterator it;
for (it = this->students.begin(); it != this->students.end(); ++it)
{
if (rollNo == (*it)->getRollNo())
{
return (*it);
}
}
return NULL;
}
void StudentDaoImpl::updateStudent(Student *st1)
{
list<Student*>::iterator it;
for (it = this->students.begin(); it != this->students.end(); ++it)
{
if (st1->getRollNo() == (*it)->getRollNo())
{
(*it)->setName(st1->getName());
break;
}
}
}
void StudentDaoImpl::deleteStudent(Student *st1)
{
list<Student*>::iterator it;
for (it = this->students.begin(); it != this->students.end(); ++it)
{
if (st1->getRollNo() == (*it)->getRollNo())
{
this->students.erase(it);
break;
}
}
}
int main()
{
StudentDao *studentdao = new StudentDaoImpl();
list<Student*> checkit = studentdao->getAllStudents();
list<Student*>::iterator it;
for (it = checkit.begin(); it != checkit.end(); ++it)
{
cout << (*it)->getName() << " : " << (*it)->getRollNo() << endl;
}
Student *t1 = studentdao->getStudent(0);
t1->setName("Michael");
studentdao->updateStudent(t1);
cout << studentdao->getStudent(0)->getName() << " : " << studentdao->getStudent(0)->getRollNo() << endl;
system("pause");
return 0;
}
在visual studio 2015上运行结果: