一步一步完善我的设计(1):第一次迭代之--设计
本帖最后由 keer_zu 于 2016-4-19 13:12 编辑最近在完成的一个小项目的重构,这是一部分初稿,采用桥接模式和策略模式。
后续会持续迭代之。
yyy71cj 发表于 2016-4-20 09:00
ROSE、ROSE、ROSE,这样是不是忒抽象了?
抽象是必须的。 等着继续更新哦,虽然我看不懂,哈哈{:lol:}
设计意图
本帖最后由 keer_zu 于 2016-4-20 09:19 编辑这部分还没有体现在上面设计中,主要是保存程序运行时的一些数据,等程序重启后恢复到之前状态。
这部分代码是半成品,目前修改的意图是实现对写入内容的具体形式解绑定,也就是做得更通用一些。
///////////////////////////////////// TransTaskDpManager ///////////////////////////////
bool TransTaskDpManager::WriteInfoToFile(DpMessageArryType &dpMsg)
{
unsigned short size;
//DpMessageType *msg;
char buf;
int i,ret;
FILE*fp=NULL;
string folder = "dpfile";
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
memset(buf,0,sizeof(buf));
string provFileName = "dpfile/" + m_filePrefix + ".prov";
string filename = "dpfile/" + m_filePrefix + ".data";
if(!IsExistedDir(folder)){
MakeDir(folder);
return false;
}
fp=fopen(provFileName.c_str(),"ab+");
if(NULL==fp){
dsLog.Log(true,LOGGER_INFO,"%s:%s:%d \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
size = dpMsg.size();
dsLog.Log(true,LOGGER_INFO,"size:%d, %s:%s:%d \n",size,__FILE__,__PRETTY_FUNCTION__,__LINE__);
buf = size/256;
buf = size%256;
fwrite(buf, 1, 2, fp);
string strMsg;
for(i = 0;i < size;i ++){
//msg = dpMsg;
strMsg = BuildJsonStr(dpMsg);
//delete(msg);
dpMsg.clear();
dsLog.Log(true,LOGGER_INFO,"strMsg:%s, %s:%s:%d \n",strMsg.c_str(),__FILE__,__PRETTY_FUNCTION__,__LINE__);
buf = strMsg.length()/256;
buf = strMsg.length()%256;
fwrite(buf, 1, 2, fp);
fwrite(strMsg.c_str(),1,strMsg.length(),fp);
}
fclose(fp);
string cmd0 = "rm -rf " + filename;
systemcmd(cmd0);
string cmd = "mv " + provFileName + " " + filename;
systemcmd(cmd);
return true;
}
bool TransTaskDpManager::GetTaskinfoFromDpFile(DpMessageArryType &dpMsgArray)
{
int i,j;
char buf;
memset(buf,0,sizeof(buf));
unsigned short msgNum,readLen;
size_t ret;
FILE*fp=NULL;
string folder = "dpfile";
string filename = "dpfile/" + m_filePrefix + ".data";
string provFileName = "dpfile/" + m_filePrefix + ".prov";
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!IsExistedDir(folder)){
MakeDir(folder);
return false;
}
fp=fopen(filename.c_str(),"r");
if(NULL==fp){
dsLog.Log(true,LOGGER_INFO,"%s:%s:%d \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
fp = fopen(provFileName.c_str(),"r");
if(NULL==fp){
dsLog.Log(true,LOGGER_INFO,"%s:%s:%d \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
string cmd = "mv " + provFileName + "" + filename;
systemcmd(cmd);
} else {
string cmd = "rm -rf " + provFileName;
systemcmd(cmd);
}
ret = fread(&msgNum,sizeof(unsigned short),1,fp);
msgNum = (msgNum%256)*256 + msgNum/256;
dsLog.Log(true,LOGGER_INFO,"%s:%s:%d msg num: %d\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,msgNum);
for(i = 0;i < msgNum;i ++){
ret = fread(&readLen,sizeof(unsigned short),1,fp);
readLen = (readLen%256)*256 + readLen/256;
ret = fread(buf,1,readLen,fp);
string msg = buf;
DpMessageType dpMsg;// = new DpMessageType;
dsLog.Log(true,LOGGER_INFO,"%s:%s:%d msg : %s\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,msg.c_str());
if(GetJsonMap(msg,dpMsg)){
dpMsgArray.push_back(dpMsg);
} else {
fclose(fp);
return false;
}
memset(buf,0,sizeof(buf));
}
fclose(fp);
return true;
}
bool TransTaskDpManager::CreateDpFile()
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
DpMessageArryTypedpMsgArry;
return GetInfoAndWriteToFile(dpMsgArry);
}
bool TransTaskDpManager::CreateDpFile(const DpMessageType &dpMsg)
{
DpMessageArryTypedpMsgArry;
//DpMessageType msg = dpMsg;
dpMsgArry.push_back(dpMsg);
return GetInfoAndWriteToFile(dpMsgArry);
}
bool TransTaskDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!GetInfoFromSystem(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetInfoFromSystem error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!WriteInfoToFile(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
/////////////////////////////////////DocDpManager /////////////////////////
/*
bool DocDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!m_queueUser->GetDocWaitQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetDocWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!m_queueUser->GetDocRunQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetDocRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!WriteInfoToFile(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
*/
bool DocDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
{
}
/////////////////////////////////////DpptDpManager /////////////////////////
/*
bool DpptDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!m_queueUser->GetDpptWaitQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetDpptWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!m_queueUser->GetDpptRunQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetDpptRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!WriteInfoToFile(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d dppt WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
*/
bool DpptDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
{
}
/////////////////////////////////////VideoDpManager /////////////////////////
/*bool VideoDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!m_queueUser->GetVideoWaitQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetVideoWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!m_queueUser->GetVideoRunQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetVideoRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!WriteInfoToFile(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d video WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
*/
bool VideoDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
{
}
keer_zu 发表于 2016-4-20 09:16
这部分还没有体现在上面设计中,主要是保存程序运行时的一些数据,等程序重启后恢复到之前状态。
这部分代 ...
从上面我的代码的修改痕迹来看,我是要把数据写入的内容放到子类里面,用多态来支持多种数据内容。同时支持数据内容的增加。 哦,对了,上面几个类的定义如下:
class TransTaskDpManager{
public:
virtual bool GetTaskinfoFromDpFile(DpMessageArryType &dpMsg);
bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry);
virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry) = 0;
bool CreateDpFile();
bool CreateDpFile(const DpMessageType &dpMsg);
protected:
bool WriteInfoToFile(DpMessageArryType &dpMsg);
IQueueUser *m_queueUser;
TaskType m_taskType;
string m_filePrefix;
string m_fileContent;
};
class DocDpManager : public TransTaskDpManager{
public:
DocDpManager(IQueueUser *usr)
{
m_taskType = DocTask;
m_filePrefix = "DOC";
m_queueUser = usr;
}
// virtual bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry);
virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);
};
class DpptDpManager : public TransTaskDpManager{
public:
DpptDpManager(IQueueUser *usr)
{
m_taskType = DpptTask;
m_filePrefix = "DPPT";
m_queueUser = usr;
}
// virtual bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry);
virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);
};
class VideoDpManager : public TransTaskDpManager{
public:
VideoDpManager(IQueueUser *usr)
{
m_taskType = VideoTask;
m_filePrefix = "VIDEO";
m_queueUser = usr;
}
// virtual bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry);
virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);
};
赞 来学习~~~ 好厉害的样子~ 经过一天,这部分现在改成这样了,类的定义:
class TransTaskDpManager{
public:
bool GetTaskinfoFromDpFile(DpMessageArryType &dpMsg);
bool GetTaskinfoFromDpFile(DpMessageArryType &dpMsg,QueueType qt);
bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry);
bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry,QueueType qt);
//virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry) = 0;
bool CreateDpFile();
bool CreateDpFile(QueueType qt);
bool CreateDpFile(const DpMessageType &dpMsg);
protected:
bool WriteInfoToFile(DpMessageArryType &dpMsg);
IQueueUser *m_queueUser;
TaskType m_taskType;
string m_filePrefix;
string m_queueType;
string m_fileContent;
};
class DocDpManager : public TransTaskDpManager{
public:
DocDpManager(IQueueUser *usr)
{
m_taskType = DocTask;
m_filePrefix = "DOC";
m_queueType = "";
m_queueUser = usr;
}
//virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);
};
class DpptDpManager : public TransTaskDpManager{
public:
DpptDpManager(IQueueUser *usr)
{
m_taskType = DpptTask;
m_filePrefix = "DPPT";
m_queueType = "";
m_queueUser = usr;
}
//virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);
};
class VideoDpManager : public TransTaskDpManager{
public:
VideoDpManager(IQueueUser *usr)
{
m_taskType = VideoTask;
m_filePrefix = "VIDEO";
m_queueType = "";
m_queueUser = usr;
}
//virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);
};
class DataPresistence:public IDataPresistence{
protected:
IQueueUser *m_queueUser;
TransTaskDpManager *m_taskDpManager;
public:
DataPresistence(IQueueUser *queueUser);
static DataPresistence& GetInstance(IQueueUser *queueUser);
//virtual IDataPresistence &CreatePresistence(IQueueUser *user);
virtual bool DpGetMessage(DpMessageArryType &dpMsg,TaskType taskType);
virtual bool DpGetWaitMessage(DpMessageArryType &dpMsg,TaskType taskType);
virtual bool DpGetRunMessage(DpMessageArryType &dpMsg,TaskType taskType);
virtual bool CreateDpMsgFile(TaskType taskType);
virtual bool CreateDpMsgFile(const DpMessageType &dpMsg,TaskType taskType);
virtual bool CreateWaitMsgFile(TaskType taskType);
virtual bool CreateRunMsgFile(TaskType taskType);
};
函数实现部分:
DataPresistence& DataPresistence::GetInstance(IQueueUser *queueUser)
{
staticDataPresistence instance_(queueUser);
return instance_;
}
DataPresistence::DataPresistence(IQueueUser *queueUser)
:m_queueUser(queueUser)
{
}
//IDataPresistence &DataPresistence::CreatePresistence(IQueueUser *user)
//{
// return GetInstance(user);
//}
bool DataPresistence::DpGetMessage(DpMessageArryType &dpMsg,TaskType taskType)
{
set_task_dp_manager(taskType);
m_taskDpManager->GetTaskinfoFromDpFile(dpMsg);
return true;
}
bool DataPresistence::DpGetWaitMessage(DpMessageArryType &dpMsg,TaskType taskType)
{
return true;
}
bool DataPresistence::DpGetRunMessage(DpMessageArryType &dpMsg,TaskType taskType)
{
return true;
}
bool DataPresistence::CreateDpMsgFile(TaskType taskType)
{
set_task_dp_manager(taskType);
m_taskDpManager->CreateDpFile();
return true;
}
bool DataPresistence::CreateDpMsgFile(const DpMessageType &dpMsg,TaskType taskType)
{
set_task_dp_manager(taskType);
m_taskDpManager->CreateDpFile(dpMsg);
return true;
}
bool DataPresistence::CreateWaitMsgFile(TaskType taskType)
{
set_task_dp_manager(taskType);
m_taskDpManager->CreateDpFile(QueueWait);
}
bool DataPresistence::CreateRunMsgFile(TaskType taskType)
{
set_task_dp_manager(taskType);
m_taskDpManager->CreateDpFile(QueueRuning);
}
///////////////////////////////////// TransTaskDpManager ///////////////////////////////
bool TransTaskDpManager::WriteInfoToFile(DpMessageArryType &dpMsg)
{
unsigned short size;
//DpMessageType *msg;
char buf;
int i,ret;
FILE*fp=NULL;
string folder = "dpfile";
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
memset(buf,0,sizeof(buf));
string provFileName = "dpfile/" + m_filePrefix + m_queueType + ".prov";
string filename = "dpfile/" + m_filePrefix + m_queueType + ".data";
if(!IsExistedDir(folder)){
MakeDir(folder);
return false;
}
fp=fopen(provFileName.c_str(),"ab+");
if(NULL==fp){
dsLog.Log(true,LOGGER_INFO,"%s:%s:%d \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
size = dpMsg.size();
dsLog.Log(true,LOGGER_INFO,"size:%d, %s:%s:%d \n",size,__FILE__,__PRETTY_FUNCTION__,__LINE__);
buf = size/256;
buf = size%256;
fwrite(buf, 1, 2, fp);
string strMsg;
for(i = 0;i < size;i ++){
//msg = dpMsg;
strMsg = BuildJsonStr(dpMsg);
//delete(msg);
dpMsg.clear();
dsLog.Log(true,LOGGER_INFO,"strMsg:%s, %s:%s:%d \n",strMsg.c_str(),__FILE__,__PRETTY_FUNCTION__,__LINE__);
buf = strMsg.length()/256;
buf = strMsg.length()%256;
fwrite(buf, 1, 2, fp);
fwrite(strMsg.c_str(),1,strMsg.length(),fp);
}
fclose(fp);
string cmd0 = "rm -rf " + filename;
systemcmd(cmd0);
string cmd = "mv " + provFileName + " " + filename;
systemcmd(cmd);
return true;
}
bool TransTaskDpManager::GetTaskinfoFromDpFile(DpMessageArryType &dpMsgArray,QueueType qt)
{
switch(qt){
case QueueWait:
m_queueType = "_WAIT";
break;
case QueueRuning:
m_queueType = "_RUN";
break;
default:
return false;
}
return GetTaskinfoFromDpFile(dpMsgArray);
}
bool TransTaskDpManager::GetTaskinfoFromDpFile(DpMessageArryType &dpMsgArray)
{
int i,j;
char buf;
memset(buf,0,sizeof(buf));
unsigned short msgNum,readLen;
size_t ret;
FILE*fp=NULL;
string folder = "dpfile";
string filename = "dpfile/" + m_filePrefix + m_queueType + ".data";
string provFileName = "dpfile/" + m_filePrefix + m_queueType + ".prov";
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!IsExistedDir(folder)){
MakeDir(folder);
return false;
}
fp=fopen(filename.c_str(),"r");
if(NULL==fp){
dsLog.Log(true,LOGGER_INFO,"%s:%s:%d \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
fp = fopen(provFileName.c_str(),"r");
if(NULL==fp){
dsLog.Log(true,LOGGER_INFO,"%s:%s:%d \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
string cmd = "mv " + provFileName + "" + filename;
systemcmd(cmd);
} else {
string cmd = "rm -rf " + provFileName;
systemcmd(cmd);
}
ret = fread(&msgNum,sizeof(unsigned short),1,fp);
msgNum = (msgNum%256)*256 + msgNum/256;
dsLog.Log(true,LOGGER_INFO,"%s:%s:%d msg num: %d\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,msgNum);
for(i = 0;i < msgNum;i ++){
ret = fread(&readLen,sizeof(unsigned short),1,fp);
readLen = (readLen%256)*256 + readLen/256;
ret = fread(buf,1,readLen,fp);
string msg = buf;
DpMessageType dpMsg;// = new DpMessageType;
dsLog.Log(true,LOGGER_INFO,"%s:%s:%d msg : %s\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,msg.c_str());
if(GetJsonMap(msg,dpMsg)){
dpMsgArray.push_back(dpMsg);
} else {
fclose(fp);
return false;
}
memset(buf,0,sizeof(buf));
}
fclose(fp);
return true;
}
bool TransTaskDpManager::CreateDpFile()
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
DpMessageArryTypedpMsgArry;
return GetInfoAndWriteToFile(dpMsgArry);
}
bool TransTaskDpManager::CreateDpFile(QueueType qt)
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
DpMessageArryTypedpMsgArry;
return GetInfoAndWriteToFile(dpMsgArry,qt);
}
bool TransTaskDpManager::CreateDpFile(const DpMessageType &dpMsg)
{
DpMessageArryTypedpMsgArry;
//DpMessageType msg = dpMsg;
dpMsgArry.push_back(dpMsg);
return GetInfoAndWriteToFile(dpMsgArry);
}
bool TransTaskDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
//if(!GetInfoFromSystem(dpMsgArry)){
// dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetInfoFromSystem error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
// return false;
//}
bool ret = false;
QueueInfo *qi = new QueueInfoAdapter(*m_queueUser);
//InfoComponent* pCom = new ConcreteInfoComponent(dpMsgArry);
ConcreteInfoComponent com(dpMsgArry);
InfoAdder* pDec = NULL;
pDec = new RunQueueInfoAdder(&com,*qi,m_taskType);
pDec = new WaitQueueInfoAdder(pDec,*qi,m_taskType);
ret = pDec->Operation();
delete qi;
delete pDec;
if(ret == false){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetQueueInfo error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!WriteInfoToFile(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
bool TransTaskDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry,QueueType qt)
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
//if(!GetInfoFromSystem(dpMsgArry,qt)){
// dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetInfoFromSystem error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
// return false;
//}
QueueInfo *qi = new QueueInfoAdapter(*m_queueUser);
bool ret = false;
//InfoComponent* pCom = new ConcreteInfoComponent(dpMsgArry);
ConcreteInfoComponent com(dpMsgArry);
InfoAdder* pDec = NULL;
switch(qt){
case QueueWait:
m_queueType = "_WAIT";
pDec = new WaitQueueInfoAdder(&com,*qi,m_taskType);
break;
case QueueRuning:
m_queueType = "_RUN";
pDec = new RunQueueInfoAdder(&com,*qi,m_taskType);
break;
default:
ret = false;
}
ret = pDec->Operation();
delete qi;
delete pDec;
if(ret == false){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetQueueInfo error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!WriteInfoToFile(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
/////////////////////////////////////DocDpManager /////////////////////////
/*
bool DocDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!m_queueUser->GetDocWaitQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetDocWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!m_queueUser->GetDocRunQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetDocRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!WriteInfoToFile(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
bool DocDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
{
QueueInfo *qi = new QueueInfoAdapter(*m_queueUser);
InfoComponent* pCom = new ConcreteInfoComponent(dpMsgArry);
ConcreteInfoComponent com(dpMsgArry);
InfoAdder* pDec = NULL;
pDec = new RunQueueInfoAdder(pCom,*qi,DocTask);
pDec = new WaitQueueInfoAdder(pDec,*qi,DocTask);
pDec->Operation();
delete qi;
delete pDec;
}
/////////////////////////////////////DpptDpManager /////////////////////////
bool DpptDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!m_queueUser->GetDpptWaitQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetDpptWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!m_queueUser->GetDpptRunQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetDpptRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!WriteInfoToFile(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d dppt WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
bool DpptDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
{
QueueInfo *qi = new QueueInfoAdapter(*m_queueUser);
InfoComponent* pCom = new ConcreteInfoComponent(dpMsgArry);
ConcreteInfoComponent com(dpMsgArry);
InfoAdder* pDec = NULL;
pDec = new RunQueueInfoAdder(pCom,*qi,DpptTask);
pDec = new WaitQueueInfoAdder(pDec,*qi,DpptTask);
pDec->Operation();
delete qi;
delete pDec;
}
/////////////////////////////////////VideoDpManager /////////////////////////
bool VideoDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!m_queueUser->GetVideoWaitQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetVideoWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!m_queueUser->GetVideoRunQueueMessage(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetVideoRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
if(!WriteInfoToFile(dpMsgArry)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d video WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
bool VideoDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
{
bool ret = false;
QueueInfo *qi = new QueueInfoAdapter(*m_queueUser);
InfoComponent* pCom = new ConcreteInfoComponent(dpMsgArry);
ConcreteInfoComponent com(dpMsgArry);
InfoAdder* pDec = NULL;
pDec = new RunQueueInfoAdder(pCom,*qi,VideoTask);
pDec = new WaitQueueInfoAdder(pDec,*qi,VideoTask);
ret = pDec->Operation();
delete qi;
delete pDec;
return ret;
}
*/
你会发现,原来在TransTaskDpManager的子类中多态实现的接口:GetInfoFromSystem,都被我用/* */注释掉了。
为什么呢?因为我将要获取(并写入文件)的信息都通过单独的类去实现了,增加的类通过装饰者模式可以动态添加这些要写入的信息。
具体做法如下面代码:
类的定义:
#include "IDataPersistence.h"
class QueueInfo
{
public:
QueueInfo();
virtual ~QueueInfo();
virtual bool GetWaitQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType);
virtual bool GetRunQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType);
};
class QueueInfoAdapter : public QueueInfo
{
public:
QueueInfoAdapter(IQueueUser &);
~QueueInfoAdapter();
virtual bool GetWaitQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType);
virtual bool GetRunQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType);
private:
IQueueUser *m_queueUser;
};
//InfoComponent抽象类,定义该类对象的接口
class InfoComponent
{
public:
virtual ~InfoComponent();
virtual bool Operation()=0;
protected:
DpMessageArryType *m_msgArry;
InfoComponent();
};
//ConcreteInfoAdder:具体的InfoComponent对象,可以给该对象动态 添加职责
class ConcreteInfoComponent:public InfoComponent
{
public:
// ConcreteInfoComponent();
ConcreteInfoComponent(DpMessageArryType &msgArray);
~ConcreteInfoComponent();
virtual bool Operation();
};
//InfoAdder:装饰抽象类,继承自InfoComponent
class InfoAdder:public InfoComponent
{
public:
InfoAdder(InfoComponent* com);
void SetInfoComponent(InfoComponent* com);
virtual ~InfoAdder();
virtual bool Operation();
protected:
InfoComponent* _com;
};
class RunQueueInfoAdder : public InfoAdder
{
public:
RunQueueInfoAdder(InfoComponent* com,QueueInfo &,TaskType taskType);
~RunQueueInfoAdder();
virtual bool Operation();
bool AddBehavor();
private:
TaskType m_taskType;
QueueInfo *m_queueInfo;
};
class WaitQueueInfoAdder : public InfoAdder
{
public:
WaitQueueInfoAdder(InfoComponent* com,QueueInfo &,TaskType taskType);
~WaitQueueInfoAdder();
virtual bool Operation();
bool AddBehavor();
private:
TaskType m_taskType;
QueueInfo *m_queueInfo;
};
其中QueueInfoAdapter通过适配器模式将 原来获取信息的接口转变为 QueueInfo 接口。采用的是对象适配器而不是类适配器。
紧接下来的几个类实现了装饰者模式。
下面代码是这些类的方法定义:
///////////////////////////////// QueueInfo ////////////////////////////////////
QueueInfo::QueueInfo()
{
}
QueueInfo::~QueueInfo()
{
}
bool QueueInfo::GetWaitQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType)
{
}
bool QueueInfo::GetRunQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType)
{
}
//////////////////////////////// QueueInfoAdapter //////////////////////////////
QueueInfoAdapter::QueueInfoAdapter(IQueueUser &queueUser)
{
m_queueUser = &queueUser;
}
QueueInfoAdapter::~QueueInfoAdapter()
{
}
bool QueueInfoAdapter::GetWaitQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType)
{
switch(taskType){
case DocTask:
return m_queueUser->GetDocWaitQueueMessage(dpMsgArry);
case VideoTask:
return m_queueUser->GetVideoWaitQueueMessage(dpMsgArry);
case DpptTask:
return m_queueUser->GetDpptWaitQueueMessage(dpMsgArry);
default:
return false;
}
}
bool QueueInfoAdapter::GetRunQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType)
{
switch(taskType){
case DocTask:
return m_queueUser->GetDocRunQueueMessage(dpMsgArry);
case VideoTask:
return m_queueUser->GetVideoRunQueueMessage(dpMsgArry);
case DpptTask:
return m_queueUser->GetDpptRunQueueMessage(dpMsgArry);
default:
return false;
}
}
//////////////////////////////// InfoComponent /////////////////////////////
InfoComponent::InfoComponent()
{
}
InfoComponent::~InfoComponent()
{
cout << "~InfoComponent" << endl;
}
//////////////////////////////// ConcreteInfoComponent /////////////////////////////
ConcreteInfoComponent::ConcreteInfoComponent(DpMessageArryType &msgArray)
{
m_msgArry = &msgArray;
}
ConcreteInfoComponent::~ConcreteInfoComponent()
{
cout << "~ConcreteInfoComponent" << endl;
}
bool ConcreteInfoComponent::Operation()
{
//cout << "ConcreteInfoComponent::Operation" << endl;
return true;
}
//////////////////////////////// InfoAdder /////////////////////////////
InfoAdder::InfoAdder(InfoComponent* com)
{
this->_com = com;
}
void InfoAdder::SetInfoComponent(InfoComponent* com)
{
this->_com = com;
}
InfoAdder::~InfoAdder()
{
cout << "~InfoAdder" << endl;
delete this->_com;
this->_com = NULL;
}
bool InfoAdder::Operation()
{
}
//////////////////////////////// RunQueueInfoAdder /////////////////////////////
RunQueueInfoAdder::RunQueueInfoAdder(InfoComponent* com,QueueInfo &queueInfo,TaskType taskType):InfoAdder(com)
{
m_queueInfo = &queueInfo;
m_taskType = taskType;
}
RunQueueInfoAdder::~RunQueueInfoAdder()
{
cout << "~RunQueueInfoAdder" << endl;
}
bool RunQueueInfoAdder::Operation()
{
this->_com->Operation();
this->AddBehavor();
}
bool RunQueueInfoAdder::AddBehavor()
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!m_queueInfo->GetRunQueueMessage(*m_msgArry,m_taskType)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetDpptRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
//////////////////////////////// WaitQueueInfoAdder /////////////////////////////
WaitQueueInfoAdder::WaitQueueInfoAdder(InfoComponent* com,QueueInfo &queueInfo,TaskType taskType):InfoAdder(com)
{
m_queueInfo = &queueInfo;
m_taskType = taskType;
}
WaitQueueInfoAdder::~WaitQueueInfoAdder()
{
cout << "~RunQueueInfoAdder" << endl;
}
bool WaitQueueInfoAdder::Operation()
{
this->_com->Operation();
this->AddBehavor();
}
bool WaitQueueInfoAdder::AddBehavor()
{
LoggerWrapper dsLog= LoggerWrapper::GetInstance();
if(!m_queueInfo->GetWaitQueueMessage(*m_msgArry,m_taskType)){
dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d GetWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
return false;
}
return true;
}
以上动态获取信息完成后,如果再有新的信息加入,我只要增加新的InfoAdder就可以了。具体的InfoAdder中关注获取的信息细节,但是InfoAdder本身是不关注这些的。 修改了两处:1. 对象中m_msgArry成员没有设置。 2. ConcreteInfoComponent 对象出现重复释放。
然后就可以通过测试函数了。实现了下面接口所实现的功能:
class IDataPresistence{
public:
//static IDataPresistence &CreatePresistence(IQueueUser *user);
virtual bool DpGetMessage(DpMessageArryType &dpMsg,TaskType taskType) = 0;
virtual bool DpGetWaitMessage(DpMessageArryType &dpMsg,TaskType taskType) = 0;
virtual bool DpGetRunMessage(DpMessageArryType &dpMsg,TaskType taskType) = 0;
virtual bool CreateDpMsgFile(TaskType taskType) = 0;
virtual bool CreateDpMsgFile(const DpMessageType &dpMsg,TaskType taskType) = 0;
//virtual bool CreateDpMsgFile(QueueType qt,const DpMessageType &dpMsg,TaskType taskType) = 0;
virtual bool CreateWaitMsgFile(TaskType taskType) = 0;
virtual bool CreateRunMsgFile(TaskType taskType) = 0;
};
测试结果OK。
测试结果(第一项,写入文件):
可以看到,成了所需文件,文件内容正确。
测试结果(第二项,从产生的文件中读取,存入Vector容器):
OK
和新的可以做些对比。 新的设计参看3 设计
页:
[1]