一种较安全的数据获取设计模式

在编程中离不开对数据的获取与处理,本文介绍一种比较安全又比较简单的数据的获取方式,以C++为例,主要借助friend来完成。

将涉及到数据的代码分为3类:数据类ClassData、数据的获取类ClassGetData、数据的使用者类ClassUseData。ClassGetData用于构造ClassData,供ClassUseData使用;ClassUseData对ClassData只有使用权,没有修改权。

//数据类,包含较多属性
class ClassData
{
public:
	string GetName()//获取名称
	{
		return m_Name;
	}
	int GetAge()//获取年龄
	{
		return m_Age;
	}
			
protected:
	void SetName(const string&name)//设置名称
	{
		m_Name=name;
	}
	void SetAge(const int&age)//设置年龄
	{
		m_Age=age;
	}

	friend class ClassGetData;//如果不考虑继承,只有ClassGetData能访问Set方法
private:
	int m_Age;
	string m_Name;
};


//获取数据的桥,从数据库Excel等源获取散列数据后,逐条构造ClassData对象,
//通过ClassData的SetData方法设置对象的具体数据(名称 年龄),将所有ClassData对象存储到m_DataList,通过GetDataGroup供使用者使用
class ClassGetData
{
public:
	ClassGetData()
	{
		GenerateDataList();
	}

	void GetDataGroup(vector<ClassData>& vecData)
	{
		vecData=m_DataList;
	}
protected:
private:
	void GenerateDataList()
	{
		//从数据源获取散列数据
		ClassData data1;//之所以不用构造函数直接传参,是因为数据往往不只是本例的2条简单数据
		data1.SetName("data1");
		data1.SetAge(1);
		m_DataList.push_back(data1);

		ClassData data2;
		data2.SetName("data2");
		data2.SetAge(2);
		m_DataList.push_back(data2);

	}
	vector<ClassData> m_DataList;

};


//数据的使用者,通过ClassGetData获取数据的列表
class ClassUseData
{
public:

	void ToUseData()////获取及使用数据
	{
		vector<ClassData> vecData;

		ClassGetData dataBridge;
		dataBridge.GetDataGroup(vecData);
		for (int i=0;i<vecData.size();i++)
		{
			int age=vecData[i].GetAge();
			string name=vecData[i].GetName();
			cout<<"name:"<<name<<",age:"<<age<<endl;

			////只能从ClassData中获取具体数据,无法对ClassData数据进行更改,以下编译不过
			//vecData[i].SetAge(age);
			//vecData[i].SetName(name);
		}
	}

protected:
private:
};

void main()
{
	ClassUseData useData;
	useData.ToUseData();
}
原文地址:https://www.cnblogs.com/originalcandy/p/13992322.html