设计模式——数据访问对象模式(C++实现)

数据访问对象模式        

           数据访问对象模式(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上运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值