欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

适配器模式的应用之让数据库型的日志管理系统同时支持早期文本文件的管理方式

程序员文章站 2022-05-26 08:39:01
...

适配器模式的应用之让数据库型的日志管理系统同时支持早期文本文件的管理方式


//声明文件

//************************************日志数据对象********************************
//日志数据对象
class CLogModel{
private:
	string strLogId;//日志编号
	string strUser;//操作人员
	string strOptTime;//操作日期
	string strContent;//日志内容
public:
	void SetLogId(string logid);
	string GetLogId();
	void SetUser(string user);
	string GetUser();
	void SetOptTime(string opttime);
	string GetOptTime();
	void SetContent(string content);
	string GetContent();
	string ToStr();
};

//数据库操作提供的管理日志接口:4种(增、删、改、查)。
class CLogDbOptApi{
public:
	virtual void Insert(CLogModel& log) = 0;//增加日志对象
	virtual void Delete(CLogModel& log) = 0;//删除日志对象
	virtual void Update(CLogModel& log) = 0;//修改日志对象
	virtual void Query() = 0;//查询所有日志对象
};

//数据库方式的存取实现这里省略。。。

//******************************将日志存储在文件文件的API****************
//假设早期己经实现了将日志写入文本文件的功能,但当时的日志文件操作Api只有
//读取、写入和显示的3个功能。为了让我们这套数据库日志管理系统同时支持早期的文本文件
//存取功能,需要转换接口才能将现有的日志写入文本文件或从中读取出来。

//定义一个操作日志文件的接口:只有三个接口(读取、写入和显示操作)
class CLogFileOptApi{
public://返回list的引用会引发程序的崩溃:write的时候将自身给清除了然后再用自身赋值!!!
	//virtual list<CLogModel>& Read() = 0;
	//virtual void Write(list<CLogModel>& lst) = 0;
	//读取文件各个日志对象,并存储在日志列表中
	virtual list<CLogModel> Read() = 0;
	 //写入日志文件,把日志列表写出到日志文件中去
	virtual void Write(list<CLogModel> lst) = 0;
	//显示出来
	virtual void Show() = 0;
};

//用文本文件对日志进行管理
class CLogFileOpt : public CLogFileOptApi{
private:
	list<CLogModel> lstLogs;
public:
	list<CLogModel> Read();
	void Write(list<CLogModel> lst);
	void Show();
};
//*******************************************适配器*************************************
//适配器
class CLogDbAdapter : public CLogDbOptApi{
private:
	CLogFileOptApi* pAdaptee;//持有需要被适配的接口对象
public://构造函数,传入需要被适配的对象
	CLogDbAdapter(CLogFileOptApi* adaptee);
	~CLogDbAdapter();
	void Insert(CLogModel& log);
	void CLogDbAdapter::Delete(CLogModel& log);
	void Update(CLogModel& log);
	 //查询所有日志对象
	void Query();
};

//实现文件

//日志数据对象
void CLogModel::SetLogId(string logid){strLogId = logid;}
string CLogModel::GetLogId(){return strLogId;}
void CLogModel::SetUser(string user){strUser = user;}
string CLogModel::GetUser(){return strUser;}
void CLogModel::SetOptTime(string opttime){strOptTime = opttime;}
string CLogModel::GetOptTime(){return strOptTime;}
void CLogModel::SetContent(string content){strContent = content;}
string CLogModel::GetContent(){return strContent;}
string CLogModel::ToStr()
{
	return "Id : " + strLogId + ", User : " + strUser + ", Time : " + strOptTime + ", Content : " + strContent;
}

list<CLogModel> CLogFileOpt::Read()
{
	//这里省略了从文件中读取的过程,直接从保存在内存中的
	//内容读取出来。
	// list<LogModel>::iterator iter = logList.begin();
	// while(iter != logList.end())
	// {
	// //cout << iter->toString() << endl;
	// ++iter;
	// }
	return lstLogs;
}
void CLogFileOpt::Write(list<CLogModel> lst)
{
	//这里省略了写入文件的过程,直接写到list中
	lstLogs.assign(lst.begin(), lst.end());
}
void CLogFileOpt::Show()
{
	cout << "******************************************************" << endl;
	for(list<CLogModel>::iterator it = lstLogs.begin(); it != lstLogs.end(); it++){
		cout << it->ToStr() << endl;
	}
	cout << "******************************************************" << endl << endl;
}
//*******************************************适配器*************************************
//适配器
CLogDbAdapter::CLogDbAdapter(CLogFileOptApi* adaptee){pAdaptee = adaptee;}
CLogDbAdapter::~CLogDbAdapter(){if(pAdaptee != NULL)		delete pAdaptee;}
void CLogDbAdapter::Insert(CLogModel& log)
{
	//1.先读取文件内容
	list<CLogModel>& lstLog = pAdaptee->Read();
	//2.加入新的日志对象
	lstLog.push_back(log);
	//重新写入文件
	pAdaptee->Write(lstLog);
}
void CLogDbAdapter::Delete(CLogModel& log)
{
	//1.先读取文件内容
	list<CLogModel>& lstLog = pAdaptee->Read();
	//2.删除日志对象
	for(list<CLogModel>::iterator it = lstLog.begin(); it != lstLog.end(); it++){
		if((*it).GetLogId() == log.GetLogId()){
			lstLog.erase(it); break;
		}
	}
	//3.重新写入文件
	pAdaptee->Write(lstLog);
}
void CLogDbAdapter::Update(CLogModel& log)
{
	//1.先读取文件内容
	list<CLogModel>& lstLog = pAdaptee->Read();
	//2.修改日志对象
	for(list<CLogModel>::iterator it = lstLog.begin(); it != lstLog.end(); it++){
		if((*it).GetLogId() == log.GetLogId()){
			(*it).SetUser(log.GetUser());
			(*it).SetOptTime(log.GetOptTime());
			(*it).SetContent(log.GetContent());
			break;
		}
	}
	//3.重新写入文件
	pAdaptee->Write(lstLog);
}
//查询所有日志对象
void CLogDbAdapter::Query(){pAdaptee->Show();}

//测试客户端

void main()
{
	CLogModel log1;
	log1.SetLogId("0001"); log1.SetUser("Tony");
	log1.SetOptTime("2018-03-22"); log1.SetContent("log1 : CreateTable");

	CLogModel log2;
	log2.SetLogId("0002"); log2.SetUser("Bob");
	log2.SetOptTime("2018-03-21"); log2.SetContent("log2 : DropTable");


	//创建数据库操作日志的接口对象
	CLogDbOptApi* pLogDb = new CLogDbAdapter(new CLogFileOpt());
	pLogDb->Insert(log1); pLogDb->Insert(log2); //保存日志文件
	pLogDb->Query();//读取日志文件


	log2.SetOptTime("2018-03-20"); log2.SetContent("log2 : DoNothing");
	pLogDb->Update(log2);
	pLogDb->Query();


	pLogDb->Delete(log2);
	pLogDb->Query();
}