一步一步完善我的设计(1):第一次迭代之--设计

[复制链接]
3474|19
 楼主| keer_zu 发表于 2016-4-19 13:10 | 显示全部楼层 |阅读模式
本帖最后由 keer_zu 于 2016-4-19 13:12 编辑

app.jpg

最近在完成的一个小项目的重构,这是一部分初稿,采用桥接模式和策略模式。
后续会持续迭代之。

ts.jpg

打赏榜单

21ic小能手 打赏了 3.00 元 2016-04-25

 楼主| keer_zu 发表于 2016-4-20 09:03 | 显示全部楼层
yyy71cj 发表于 2016-4-20 09:00
ROSE、ROSE、ROSE,这样是不是忒抽象了?

抽象是必须的。
21ic小喇叭 发表于 2016-4-20 09:10 | 显示全部楼层
等着继续更新哦,虽然我看不懂,哈哈
 楼主| keer_zu 发表于 2016-4-20 09:16 | 显示全部楼层

设计意图

本帖最后由 keer_zu 于 2016-4-20 09:19 编辑

这部分还没有体现在上面设计中,主要是保存程序运行时的一些数据,等程序重启后恢复到之前状态。
这部分代码是半成品,目前修改的意图是实现对写入内容的具体形式解绑定,也就是做得更通用一些。

  1. ///////////////////////////////////// TransTaskDpManager ///////////////////////////////



  2. bool TransTaskDpManager::WriteInfoToFile(DpMessageArryType &dpMsg)
  3. {
  4.         unsigned short size;
  5.         //DpMessageType *msg;
  6.         char buf[1024];
  7.         int i,ret;
  8.         FILE*fp=NULL;
  9.         string folder = "dpfile";
  10.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();
  11.         memset(buf,0,sizeof(buf));
  12.         string provFileName = "dpfile/" + m_filePrefix + ".prov";
  13.         string filename = "dpfile/" + m_filePrefix + ".data";

  14.         if(!IsExistedDir(folder)){
  15.                 MakeDir(folder);
  16.                 return false;
  17.         }
  18.        
  19.         fp=fopen(provFileName.c_str(),"ab+");
  20.         if(NULL==fp){
  21.                 dsLog.Log(true,LOGGER_INFO,"%s:%s:%d   \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  22.                 return false;
  23.         }

  24.         size = dpMsg.size();

  25.         dsLog.Log(true,LOGGER_INFO,"size:%d, %s:%s:%d   \n",size,__FILE__,__PRETTY_FUNCTION__,__LINE__);

  26.         buf[0] = size/256;
  27.         buf[1] = size%256;

  28.         fwrite(buf, 1, 2, fp);

  29.         string strMsg;
  30.         for(i = 0;i < size;i ++){
  31.                 //msg = dpMsg[i];
  32.                 strMsg = BuildJsonStr(dpMsg[i]);

  33.                 //delete(msg);
  34.                 dpMsg[i].clear();

  35.                 dsLog.Log(true,LOGGER_INFO,"strMsg:%s, %s:%s:%d   \n",strMsg.c_str(),__FILE__,__PRETTY_FUNCTION__,__LINE__);
  36.                
  37.                 buf[0] = strMsg.length()/256;
  38.                 buf[1] = strMsg.length()%256;
  39.                 fwrite(buf, 1, 2, fp);

  40.                 fwrite(strMsg.c_str(),1,strMsg.length(),fp);
  41.         }
  42.        
  43.         fclose(fp);

  44.         string cmd0 = "rm -rf " + filename;
  45.         systemcmd(cmd0);
  46.         string cmd = "mv " + provFileName + " " + filename;
  47.         systemcmd(cmd);

  48.         return true;
  49. }





  50. bool TransTaskDpManager::GetTaskinfoFromDpFile(DpMessageArryType &dpMsgArray)
  51. {
  52.         int i,j;
  53.         char buf[2096];
  54.         memset(buf,0,sizeof(buf));
  55.         unsigned short msgNum,readLen;
  56.         size_t ret;
  57.         FILE*fp=NULL;
  58.         string folder = "dpfile";
  59.         string filename = "dpfile/" + m_filePrefix + ".data";
  60.         string provFileName = "dpfile/" + m_filePrefix + ".prov";
  61.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();
  62.        
  63.         if(!IsExistedDir(folder)){
  64.                 MakeDir(folder);
  65.                 return false;
  66.         }

  67.         fp=fopen(filename.c_str(),"r");
  68.         if(NULL==fp){
  69.                 dsLog.Log(true,LOGGER_INFO,"%s:%s:%d   \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  70.                 fp = fopen(provFileName.c_str(),"r");
  71.                 if(NULL==fp){
  72.                         dsLog.Log(true,LOGGER_INFO,"%s:%s:%d   \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  73.                         return false;
  74.                 }
  75.                 string cmd = "mv " + provFileName + "  " + filename;
  76.                        
  77.                 systemcmd(cmd);
  78.         } else {
  79.                 string cmd = "rm -rf " + provFileName;
  80.                 systemcmd(cmd);
  81.         }

  82.         ret = fread(&msgNum,sizeof(unsigned short),1,fp);       
  83.         msgNum = (msgNum%256)*256 + msgNum/256;
  84.         dsLog.Log(true,LOGGER_INFO,"%s:%s:%d        msg num: %d\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,msgNum);

  85.         for(i = 0;i < msgNum;i ++){
  86.                 ret = fread(&readLen,sizeof(unsigned short),1,fp);
  87.                 readLen = (readLen%256)*256 + readLen/256;
  88.                 ret = fread(buf,1,readLen,fp);


  89.                 string msg = buf;
  90.                 DpMessageType dpMsg;// = new DpMessageType;       
  91.                 dsLog.Log(true,LOGGER_INFO,"%s:%s:%d        msg : %s\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,msg.c_str());
  92.                 if(GetJsonMap(msg,dpMsg)){
  93.                         dpMsgArray.push_back(dpMsg);
  94.                 } else {
  95.                         fclose(fp);
  96.                         return false;
  97.                 }

  98.                 memset(buf,0,sizeof(buf));
  99.         }

  100.        

  101.         fclose(fp);
  102.         return true;
  103.        
  104. }


  105. bool TransTaskDpManager::CreateDpFile()
  106. {
  107.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();
  108.         DpMessageArryType  dpMsgArry;
  109.        
  110.         return GetInfoAndWriteToFile(dpMsgArry);
  111. }


  112. bool TransTaskDpManager::CreateDpFile(const DpMessageType &dpMsg)
  113. {
  114.         DpMessageArryType  dpMsgArry;
  115.         //DpMessageType msg = dpMsg;

  116.         dpMsgArry.push_back(dpMsg);

  117.         return GetInfoAndWriteToFile(dpMsgArry);
  118. }

  119. bool TransTaskDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
  120. {
  121.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();

  122.         if(!GetInfoFromSystem(dpMsgArry)){
  123.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetInfoFromSystem error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  124.                 return false;
  125.         }
  126.        
  127.         if(!WriteInfoToFile(dpMsgArry)){
  128.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  129.                 return false;
  130.         }


  131.         return true;
  132. }


  133. /////////////////////////////////////  DocDpManager /////////////////////////
  134. /*
  135. bool DocDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
  136. {
  137.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();

  138.         if(!m_queueUser->GetDocWaitQueueMessage(dpMsgArry)){
  139.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetDocWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  140.                 return false;
  141.         }
  142.        
  143.         if(!m_queueUser->GetDocRunQueueMessage(dpMsgArry)){
  144.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetDocRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  145.                 return false;
  146.         }
  147.        
  148.         if(!WriteInfoToFile(dpMsgArry)){
  149.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  150.                 return false;
  151.         }
  152.        
  153.         return true;
  154. }
  155. */

  156. bool DocDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
  157. {

  158. }

  159. /////////////////////////////////////  DpptDpManager /////////////////////////
  160. /*
  161. bool DpptDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
  162. {
  163.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();

  164.         if(!m_queueUser->GetDpptWaitQueueMessage(dpMsgArry)){
  165.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetDpptWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  166.                 return false;
  167.         }
  168.        
  169.         if(!m_queueUser->GetDpptRunQueueMessage(dpMsgArry)){
  170.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetDpptRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  171.                 return false;
  172.         }
  173.        
  174.         if(!WriteInfoToFile(dpMsgArry)){
  175.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   dppt WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  176.                 return false;
  177.         }
  178.        
  179.         return true;
  180. }
  181. */

  182. bool DpptDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
  183. {

  184. }




  185. /////////////////////////////////////  VideoDpManager /////////////////////////
  186. /*bool VideoDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
  187. {
  188.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();

  189.         if(!m_queueUser->GetVideoWaitQueueMessage(dpMsgArry)){
  190.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetVideoWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  191.                 return false;
  192.         }
  193.        
  194.         if(!m_queueUser->GetVideoRunQueueMessage(dpMsgArry)){
  195.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetVideoRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  196.                 return false;
  197.         }
  198.        
  199.         if(!WriteInfoToFile(dpMsgArry)){
  200.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   video WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  201.                 return false;
  202.         }
  203.        
  204.         return true;
  205. }
  206. */

  207. bool VideoDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
  208. {

  209. }

 楼主| keer_zu 发表于 2016-4-20 09:22 | 显示全部楼层
keer_zu 发表于 2016-4-20 09:16
这部分还没有体现在上面设计中,主要是保存程序运行时的一些数据,等程序重启后恢复到之前状态。
这部分代 ...

从上面我的代码的修改痕迹来看,我是要把数据写入的内容放到子类里面,用多态来支持多种数据内容。同时支持数据内容的增加。
 楼主| keer_zu 发表于 2016-4-20 09:25 | 显示全部楼层
哦,对了,上面几个类的定义如下:

  1. class TransTaskDpManager{

  2. public:       
  3.         virtual bool GetTaskinfoFromDpFile(DpMessageArryType &dpMsg);
  4.        
  5.         bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry);

  6.         virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry) = 0;
  7.        
  8.         bool CreateDpFile();
  9.        
  10.         bool CreateDpFile(const DpMessageType &dpMsg);
  11.        
  12. protected:
  13.        
  14.         bool WriteInfoToFile(DpMessageArryType &dpMsg);
  15.        
  16.         IQueueUser *m_queueUser;
  17.         TaskType m_taskType;

  18.         string m_filePrefix;
  19.         string m_fileContent;
  20. };

  21. class DocDpManager : public TransTaskDpManager{
  22. public:
  23.         DocDpManager(IQueueUser *usr)
  24.         {
  25.                 m_taskType = DocTask;
  26.                 m_filePrefix = "DOC";
  27.                 m_queueUser = usr;
  28.         }
  29.        
  30. //        virtual bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry);
  31.         virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);
  32. };

  33. class DpptDpManager : public TransTaskDpManager{
  34. public:
  35.         DpptDpManager(IQueueUser *usr)
  36.         {
  37.                 m_taskType = DpptTask;
  38.                 m_filePrefix = "DPPT";
  39.                 m_queueUser = usr;
  40.         }
  41.        
  42. //        virtual bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry);
  43.         virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);
  44. };

  45. class VideoDpManager : public TransTaskDpManager{
  46. public:
  47.         VideoDpManager(IQueueUser *usr)       
  48.         {
  49.                 m_taskType = VideoTask;
  50.                 m_filePrefix = "VIDEO";
  51.                 m_queueUser = usr;
  52.         }

  53. //        virtual bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry);
  54.         virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);
  55. };

eyesee2008 发表于 2016-4-20 11:25 | 显示全部楼层
洛理小子 发表于 2016-4-20 12:39 | 显示全部楼层
来学习~~~
皈依 发表于 2016-4-20 20:44 | 显示全部楼层
好厉害的样子~
 楼主| keer_zu 发表于 2016-4-20 21:15 | 显示全部楼层
经过一天,这部分现在改成这样了,类的定义:

  1. class TransTaskDpManager{

  2. public:       
  3.         bool GetTaskinfoFromDpFile(DpMessageArryType &dpMsg);
  4.         bool GetTaskinfoFromDpFile(DpMessageArryType &dpMsg,QueueType qt);
  5.        
  6.         bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry);
  7.         bool GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry,QueueType qt);

  8.         //virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry) = 0;
  9.        
  10.        
  11.         bool CreateDpFile();
  12.         bool CreateDpFile(QueueType qt);
  13.        
  14.         bool CreateDpFile(const DpMessageType &dpMsg);
  15.        
  16. protected:
  17.        
  18.         bool WriteInfoToFile(DpMessageArryType &dpMsg);
  19.        
  20.         IQueueUser *m_queueUser;
  21.         TaskType m_taskType;

  22.         string m_filePrefix;
  23.         string m_queueType;
  24.         string m_fileContent;
  25. };

  26. class DocDpManager : public TransTaskDpManager{
  27. public:
  28.         DocDpManager(IQueueUser *usr)
  29.         {
  30.                 m_taskType = DocTask;
  31.                 m_filePrefix = "DOC";
  32.                 m_queueType = "";
  33.                 m_queueUser = usr;
  34.         }
  35.        
  36.         //virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);

  37. };

  38. class DpptDpManager : public TransTaskDpManager{
  39. public:
  40.         DpptDpManager(IQueueUser *usr)
  41.         {
  42.                 m_taskType = DpptTask;
  43.                 m_filePrefix = "DPPT";
  44.                 m_queueType = "";
  45.                 m_queueUser = usr;
  46.         }
  47.        

  48.         //virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);

  49. };

  50. class VideoDpManager : public TransTaskDpManager{
  51. public:
  52.         VideoDpManager(IQueueUser *usr)       
  53.         {
  54.                 m_taskType = VideoTask;
  55.                 m_filePrefix = "VIDEO";
  56.                 m_queueType = "";
  57.                 m_queueUser = usr;
  58.         }

  59.         //virtual bool GetInfoFromSystem(DpMessageArryType &dpMsgArry);
  60. };


  61. class DataPresistence:public IDataPresistence{
  62. protected:
  63.         IQueueUser *m_queueUser;
  64.         TransTaskDpManager *m_taskDpManager;
  65. public:
  66.        
  67.         DataPresistence(IQueueUser *queueUser);
  68.         static DataPresistence& GetInstance(IQueueUser *queueUser);

  69.        
  70.         //virtual IDataPresistence &CreatePresistence(IQueueUser *user);
  71.         virtual bool DpGetMessage(DpMessageArryType &dpMsg,TaskType taskType);
  72.         virtual bool DpGetWaitMessage(DpMessageArryType &dpMsg,TaskType taskType);
  73.         virtual bool DpGetRunMessage(DpMessageArryType &dpMsg,TaskType taskType);
  74.         virtual bool CreateDpMsgFile(TaskType taskType);
  75.         virtual bool CreateDpMsgFile(const DpMessageType &dpMsg,TaskType taskType);
  76.         virtual bool CreateWaitMsgFile(TaskType taskType);
  77.         virtual bool CreateRunMsgFile(TaskType taskType);
  78.        
  79. };

 楼主| keer_zu 发表于 2016-4-20 21:16 | 显示全部楼层
函数实现部分:

  1. DataPresistence& DataPresistence::GetInstance(IQueueUser *queueUser)
  2. {
  3.         static  DataPresistence instance_(queueUser);
  4.         return instance_;

  5. }

  6. DataPresistence::DataPresistence(IQueueUser *queueUser)
  7.         :m_queueUser(queueUser)
  8. {
  9.        
  10. }

  11. //IDataPresistence &DataPresistence::CreatePresistence(IQueueUser *user)
  12. //{
  13. //        return GetInstance(user);
  14. //}


  15. bool DataPresistence::DpGetMessage(DpMessageArryType &dpMsg,TaskType taskType)
  16. {
  17.         set_task_dp_manager(taskType);
  18.         m_taskDpManager->GetTaskinfoFromDpFile(dpMsg);
  19.        
  20.         return true;
  21. }

  22. bool DataPresistence::DpGetWaitMessage(DpMessageArryType &dpMsg,TaskType taskType)
  23. {
  24.        
  25.         return true;
  26. }


  27. bool DataPresistence::DpGetRunMessage(DpMessageArryType &dpMsg,TaskType taskType)
  28. {

  29.         return true;
  30. }


  31. bool DataPresistence::CreateDpMsgFile(TaskType taskType)
  32. {
  33.         set_task_dp_manager(taskType);
  34.         m_taskDpManager->CreateDpFile();
  35.         return true;
  36. }

  37. bool DataPresistence::CreateDpMsgFile(const DpMessageType &dpMsg,TaskType taskType)
  38. {
  39.         set_task_dp_manager(taskType);
  40.         m_taskDpManager->CreateDpFile(dpMsg);
  41.        
  42.         return true;
  43. }

  44. bool DataPresistence::CreateWaitMsgFile(TaskType taskType)
  45. {
  46.         set_task_dp_manager(taskType);
  47.         m_taskDpManager->CreateDpFile(QueueWait);
  48. }

  49. bool DataPresistence::CreateRunMsgFile(TaskType taskType)
  50. {
  51.         set_task_dp_manager(taskType);
  52.         m_taskDpManager->CreateDpFile(QueueRuning);
  53. }


  54. ///////////////////////////////////// TransTaskDpManager ///////////////////////////////



  55. bool TransTaskDpManager::WriteInfoToFile(DpMessageArryType &dpMsg)
  56. {
  57.         unsigned short size;
  58.         //DpMessageType *msg;
  59.         char buf[1024];
  60.         int i,ret;
  61.         FILE*fp=NULL;
  62.         string folder = "dpfile";
  63.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();
  64.         memset(buf,0,sizeof(buf));
  65.         string provFileName = "dpfile/" + m_filePrefix + m_queueType + ".prov";
  66.         string filename = "dpfile/" + m_filePrefix + m_queueType + ".data";

  67.         if(!IsExistedDir(folder)){
  68.                 MakeDir(folder);
  69.                 return false;
  70.         }
  71.        
  72.         fp=fopen(provFileName.c_str(),"ab+");
  73.         if(NULL==fp){
  74.                 dsLog.Log(true,LOGGER_INFO,"%s:%s:%d   \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  75.                 return false;
  76.         }

  77.         size = dpMsg.size();

  78.         dsLog.Log(true,LOGGER_INFO,"size:%d, %s:%s:%d   \n",size,__FILE__,__PRETTY_FUNCTION__,__LINE__);

  79.         buf[0] = size/256;
  80.         buf[1] = size%256;

  81.         fwrite(buf, 1, 2, fp);

  82.         string strMsg;
  83.         for(i = 0;i < size;i ++){
  84.                 //msg = dpMsg[i];
  85.                 strMsg = BuildJsonStr(dpMsg[i]);

  86.                 //delete(msg);
  87.                 dpMsg[i].clear();

  88.                 dsLog.Log(true,LOGGER_INFO,"strMsg:%s, %s:%s:%d   \n",strMsg.c_str(),__FILE__,__PRETTY_FUNCTION__,__LINE__);
  89.                
  90.                 buf[0] = strMsg.length()/256;
  91.                 buf[1] = strMsg.length()%256;
  92.                 fwrite(buf, 1, 2, fp);

  93.                 fwrite(strMsg.c_str(),1,strMsg.length(),fp);
  94.         }
  95.        
  96.         fclose(fp);

  97.         string cmd0 = "rm -rf " + filename;
  98.         systemcmd(cmd0);
  99.         string cmd = "mv " + provFileName + " " + filename;
  100.         systemcmd(cmd);

  101.         return true;
  102. }


  103. bool TransTaskDpManager::GetTaskinfoFromDpFile(DpMessageArryType &dpMsgArray,QueueType qt)
  104. {
  105.         switch(qt){
  106.                 case QueueWait:
  107.                         m_queueType = "_WAIT";
  108.                         break;
  109.                 case QueueRuning:
  110.                         m_queueType = "_RUN";
  111.                         break;
  112.                 default:
  113.                         return false;
  114.         }
  115.         return GetTaskinfoFromDpFile(dpMsgArray);
  116. }


  117. bool TransTaskDpManager::GetTaskinfoFromDpFile(DpMessageArryType &dpMsgArray)
  118. {
  119.         int i,j;
  120.         char buf[2096];
  121.         memset(buf,0,sizeof(buf));
  122.         unsigned short msgNum,readLen;
  123.         size_t ret;
  124.         FILE*fp=NULL;
  125.         string folder = "dpfile";
  126.         string filename = "dpfile/" + m_filePrefix + m_queueType + ".data";
  127.         string provFileName = "dpfile/" + m_filePrefix + m_queueType + ".prov";
  128.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();
  129.        
  130.         if(!IsExistedDir(folder)){
  131.                 MakeDir(folder);
  132.                 return false;
  133.         }

  134.         fp=fopen(filename.c_str(),"r");
  135.         if(NULL==fp){
  136.                 dsLog.Log(true,LOGGER_INFO,"%s:%s:%d   \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  137.                 fp = fopen(provFileName.c_str(),"r");
  138.                 if(NULL==fp){
  139.                         dsLog.Log(true,LOGGER_INFO,"%s:%s:%d   \n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  140.                         return false;
  141.                 }
  142.                 string cmd = "mv " + provFileName + "  " + filename;
  143.                        
  144.                 systemcmd(cmd);
  145.         } else {
  146.                 string cmd = "rm -rf " + provFileName;
  147.                 systemcmd(cmd);
  148.         }

  149.         ret = fread(&msgNum,sizeof(unsigned short),1,fp);       
  150.         msgNum = (msgNum%256)*256 + msgNum/256;
  151.         dsLog.Log(true,LOGGER_INFO,"%s:%s:%d        msg num: %d\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,msgNum);

  152.         for(i = 0;i < msgNum;i ++){
  153.                 ret = fread(&readLen,sizeof(unsigned short),1,fp);
  154.                 readLen = (readLen%256)*256 + readLen/256;
  155.                 ret = fread(buf,1,readLen,fp);


  156.                 string msg = buf;
  157.                 DpMessageType dpMsg;// = new DpMessageType;       
  158.                 dsLog.Log(true,LOGGER_INFO,"%s:%s:%d        msg : %s\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,msg.c_str());
  159.                 if(GetJsonMap(msg,dpMsg)){
  160.                         dpMsgArray.push_back(dpMsg);
  161.                 } else {
  162.                         fclose(fp);
  163.                         return false;
  164.                 }

  165.                 memset(buf,0,sizeof(buf));
  166.         }

  167.        

  168.         fclose(fp);
  169.         return true;
  170.        
  171. }


  172. bool TransTaskDpManager::CreateDpFile()
  173. {
  174.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();
  175.         DpMessageArryType  dpMsgArry;
  176.        
  177.         return GetInfoAndWriteToFile(dpMsgArry);
  178. }


  179. bool TransTaskDpManager::CreateDpFile(QueueType qt)
  180. {
  181.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();
  182.         DpMessageArryType  dpMsgArry;
  183.        
  184.         return GetInfoAndWriteToFile(dpMsgArry,qt);
  185. }


  186. bool TransTaskDpManager::CreateDpFile(const DpMessageType &dpMsg)
  187. {
  188.         DpMessageArryType  dpMsgArry;
  189.         //DpMessageType msg = dpMsg;

  190.         dpMsgArry.push_back(dpMsg);

  191.         return GetInfoAndWriteToFile(dpMsgArry);
  192. }

  193. bool TransTaskDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
  194. {
  195.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();

  196.         //if(!GetInfoFromSystem(dpMsgArry)){
  197.         //        dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetInfoFromSystem error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  198.         //        return false;
  199.         //}

  200.         bool ret = false;
  201.         QueueInfo *qi = new QueueInfoAdapter(*m_queueUser);

  202.         //InfoComponent* pCom = new ConcreteInfoComponent(dpMsgArry);   
  203.         ConcreteInfoComponent com(dpMsgArry);
  204.         InfoAdder* pDec = NULL;
  205.         pDec = new RunQueueInfoAdder(&com,*qi,m_taskType);         
  206.         pDec = new WaitQueueInfoAdder(pDec,*qi,m_taskType);         
  207.         ret = pDec->Operation();

  208.         delete qi;
  209.         delete pDec;

  210.         if(ret == false){
  211.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetQueueInfo error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  212.                 return false;
  213.         }
  214.        
  215.         if(!WriteInfoToFile(dpMsgArry)){
  216.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  217.                 return false;
  218.         }


  219.         return true;
  220. }


  221. bool TransTaskDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry,QueueType qt)
  222. {
  223.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();

  224.         //if(!GetInfoFromSystem(dpMsgArry,qt)){
  225.         //        dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetInfoFromSystem error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  226.         //        return false;
  227.         //}
  228.         QueueInfo *qi = new QueueInfoAdapter(*m_queueUser);
  229.         bool ret = false;
  230.         //InfoComponent* pCom = new ConcreteInfoComponent(dpMsgArry);   
  231.         ConcreteInfoComponent com(dpMsgArry);
  232.         InfoAdder* pDec = NULL;
  233.         switch(qt){
  234.                 case QueueWait:
  235.                         m_queueType = "_WAIT";
  236.                         pDec = new WaitQueueInfoAdder(&com,*qi,m_taskType);   
  237.                         break;
  238.                 case QueueRuning:
  239.                         m_queueType = "_RUN";
  240.                         pDec = new RunQueueInfoAdder(&com,*qi,m_taskType);
  241.                         break;
  242.                 default:
  243.                         ret = false;
  244.         }
  245.        
  246.         ret = pDec->Operation();

  247.         delete qi;
  248.         delete pDec;
  249.         if(ret == false){
  250.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetQueueInfo error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  251.                 return false;
  252.         }
  253.        
  254.         if(!WriteInfoToFile(dpMsgArry)){
  255.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  256.                 return false;
  257.         }


  258.         return true;
  259. }


  260. /////////////////////////////////////  DocDpManager /////////////////////////
  261. /*
  262. bool DocDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
  263. {
  264.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();

  265.         if(!m_queueUser->GetDocWaitQueueMessage(dpMsgArry)){
  266.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetDocWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  267.                 return false;
  268.         }
  269.        
  270.         if(!m_queueUser->GetDocRunQueueMessage(dpMsgArry)){
  271.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetDocRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  272.                 return false;
  273.         }
  274.        
  275.         if(!WriteInfoToFile(dpMsgArry)){
  276.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  277.                 return false;
  278.         }
  279.        
  280.         return true;
  281. }


  282. bool DocDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
  283. {
  284.         QueueInfo *qi = new QueueInfoAdapter(*m_queueUser);

  285.         InfoComponent* pCom = new ConcreteInfoComponent(dpMsgArry);   
  286.         ConcreteInfoComponent com(dpMsgArry);
  287.         InfoAdder* pDec = NULL;
  288.         pDec = new RunQueueInfoAdder(pCom,*qi,DocTask);         
  289.         pDec = new WaitQueueInfoAdder(pDec,*qi,DocTask);         
  290.         pDec->Operation();

  291.         delete qi;
  292.         delete pDec;
  293. }



  294. /////////////////////////////////////  DpptDpManager /////////////////////////

  295. bool DpptDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
  296. {
  297.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();

  298.         if(!m_queueUser->GetDpptWaitQueueMessage(dpMsgArry)){
  299.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetDpptWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  300.                 return false;
  301.         }
  302.        
  303.         if(!m_queueUser->GetDpptRunQueueMessage(dpMsgArry)){
  304.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetDpptRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  305.                 return false;
  306.         }
  307.        
  308.         if(!WriteInfoToFile(dpMsgArry)){
  309.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   dppt WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  310.                 return false;
  311.         }
  312.        
  313.         return true;
  314. }


  315. bool DpptDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
  316. {
  317.         QueueInfo *qi = new QueueInfoAdapter(*m_queueUser);

  318.         InfoComponent* pCom = new ConcreteInfoComponent(dpMsgArry);   
  319.         ConcreteInfoComponent com(dpMsgArry);
  320.         InfoAdder* pDec = NULL;
  321.         pDec = new RunQueueInfoAdder(pCom,*qi,DpptTask);         
  322.         pDec = new WaitQueueInfoAdder(pDec,*qi,DpptTask);         
  323.         pDec->Operation();

  324.         delete qi;
  325.         delete pDec;
  326. }



  327. /////////////////////////////////////  VideoDpManager /////////////////////////
  328. bool VideoDpManager::GetInfoAndWriteToFile(DpMessageArryType &dpMsgArry)
  329. {
  330.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();

  331.         if(!m_queueUser->GetVideoWaitQueueMessage(dpMsgArry)){
  332.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetVideoWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  333.                 return false;
  334.         }
  335.        
  336.         if(!m_queueUser->GetVideoRunQueueMessage(dpMsgArry)){
  337.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetVideoRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  338.                 return false;
  339.         }
  340.        
  341.         if(!WriteInfoToFile(dpMsgArry)){
  342.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   video WriteInfoToFile error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  343.                 return false;
  344.         }
  345.        
  346.         return true;
  347. }

  348. bool VideoDpManager::GetInfoFromSystem(DpMessageArryType &dpMsgArry)
  349. {
  350.         bool ret = false;
  351.         QueueInfo *qi = new QueueInfoAdapter(*m_queueUser);

  352.         InfoComponent* pCom = new ConcreteInfoComponent(dpMsgArry);   
  353.         ConcreteInfoComponent com(dpMsgArry);
  354.         InfoAdder* pDec = NULL;
  355.         pDec = new RunQueueInfoAdder(pCom,*qi,VideoTask);         
  356.         pDec = new WaitQueueInfoAdder(pDec,*qi,VideoTask);         
  357.         ret = pDec->Operation();

  358.         delete qi;
  359.         delete pDec;

  360.         return ret;
  361. }
  362. */




 楼主| keer_zu 发表于 2016-4-20 21:22 | 显示全部楼层
你会发现,原来在TransTaskDpManager的子类中多态实现的接口:GetInfoFromSystem,都被我用/* */注释掉了。
为什么呢?因为我将要获取(并写入文件)的信息都通过单独的类去实现了,增加的类通过装饰者模式可以动态添加这些要写入的信息。
具体做法如下面代码:

类的定义:
  1. #include "IDataPersistence.h"

  2. class QueueInfo
  3. {
  4. public:
  5.         QueueInfo();
  6.         virtual ~QueueInfo();
  7.         virtual bool GetWaitQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType);
  8.         virtual bool GetRunQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType);
  9. };


  10. class QueueInfoAdapter : public QueueInfo
  11. {
  12. public:
  13.         QueueInfoAdapter(IQueueUser &);
  14.         ~QueueInfoAdapter();
  15.         virtual bool GetWaitQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType);
  16.         virtual bool GetRunQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType);
  17. private:
  18.          IQueueUser *m_queueUser;
  19. };


  20. //InfoComponent抽象类,定义该类对象的接口
  21. class InfoComponent
  22. {
  23. public:
  24.         virtual ~InfoComponent();
  25.         virtual bool Operation()=0;
  26. protected:
  27.         DpMessageArryType *m_msgArry;
  28.         InfoComponent();
  29. };

  30. //ConcreteInfoAdder:具体的InfoComponent对象,可以给该对象动态 添加职责
  31. class ConcreteInfoComponent:public InfoComponent
  32. {
  33. public:
  34. //        ConcreteInfoComponent();
  35.         ConcreteInfoComponent(DpMessageArryType &msgArray);
  36.         ~ConcreteInfoComponent();
  37.         virtual bool Operation();
  38. };

  39. //InfoAdder:装饰抽象类,继承自InfoComponent
  40. class InfoAdder:public InfoComponent
  41. {
  42. public:
  43.         InfoAdder(InfoComponent* com);
  44.         void SetInfoComponent(InfoComponent* com);
  45.         virtual ~InfoAdder();
  46.         virtual bool Operation();
  47. protected:
  48.         InfoComponent* _com;
  49. };

  50. class RunQueueInfoAdder : public InfoAdder
  51. {
  52. public:
  53.         RunQueueInfoAdder(InfoComponent* com,QueueInfo &,TaskType taskType);
  54.         ~RunQueueInfoAdder();
  55.         virtual bool Operation();
  56.         bool AddBehavor();
  57. private:
  58.         TaskType m_taskType;
  59.         QueueInfo *m_queueInfo;
  60. };


  61. class WaitQueueInfoAdder : public InfoAdder
  62. {
  63. public:
  64.         WaitQueueInfoAdder(InfoComponent* com,QueueInfo &,TaskType taskType);
  65.         ~WaitQueueInfoAdder();
  66.         virtual bool Operation();
  67.         bool AddBehavor();
  68. private:
  69.         TaskType m_taskType;
  70.         QueueInfo *m_queueInfo;
  71. };


 楼主| keer_zu 发表于 2016-4-20 21:25 | 显示全部楼层
其中QueueInfoAdapter通过适配器模式将 原来获取信息的接口转变为 QueueInfo 接口。采用的是对象适配器而不是类适配器。
紧接下来的几个类实现了装饰者模式。

下面代码是这些类的方法定义:


  1. ///////////////////////////////// QueueInfo ////////////////////////////////////

  2. QueueInfo::QueueInfo()
  3. {

  4. }

  5. QueueInfo::~QueueInfo()
  6. {

  7. }

  8. bool QueueInfo::GetWaitQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType)
  9. {

  10. }

  11. bool QueueInfo::GetRunQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType)
  12. {

  13. }



  14. //////////////////////////////// QueueInfoAdapter //////////////////////////////


  15. QueueInfoAdapter::QueueInfoAdapter(IQueueUser &queueUser)
  16. {
  17.         m_queueUser = &queueUser;
  18. }

  19. QueueInfoAdapter::~QueueInfoAdapter()
  20. {

  21. }

  22. bool QueueInfoAdapter::GetWaitQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType)
  23. {
  24.         switch(taskType){
  25.                 case DocTask:
  26.                         return m_queueUser->GetDocWaitQueueMessage(dpMsgArry);
  27.                 case VideoTask:
  28.                         return m_queueUser->GetVideoWaitQueueMessage(dpMsgArry);
  29.                 case DpptTask:
  30.                         return m_queueUser->GetDpptWaitQueueMessage(dpMsgArry);
  31.                 default:
  32.                         return false;
  33.         }
  34. }

  35. bool QueueInfoAdapter::GetRunQueueMessage(DpMessageArryType &dpMsgArry,TaskType taskType)
  36. {
  37.         switch(taskType){
  38.                 case DocTask:
  39.                         return m_queueUser->GetDocRunQueueMessage(dpMsgArry);
  40.                 case VideoTask:
  41.                         return m_queueUser->GetVideoRunQueueMessage(dpMsgArry);
  42.                 case DpptTask:
  43.                         return m_queueUser->GetDpptRunQueueMessage(dpMsgArry);
  44.                 default:
  45.                         return false;
  46.         }
  47. }


  48. //////////////////////////////// InfoComponent /////////////////////////////
  49. InfoComponent::InfoComponent()
  50. {

  51. }

  52. InfoComponent::~InfoComponent()
  53. {
  54.         cout << "~InfoComponent" << endl;
  55. }

  56. //////////////////////////////// ConcreteInfoComponent /////////////////////////////
  57. ConcreteInfoComponent::ConcreteInfoComponent(DpMessageArryType &msgArray)
  58. {
  59.         m_msgArry = &msgArray;
  60. }

  61. ConcreteInfoComponent::~ConcreteInfoComponent()
  62. {
  63.         cout << "~ConcreteInfoComponent" << endl;
  64. }

  65. bool ConcreteInfoComponent::Operation()
  66. {
  67.         //cout << "ConcreteInfoComponent::Operation" << endl;
  68.         return true;
  69. }


  70. //////////////////////////////// InfoAdder /////////////////////////////
  71. InfoAdder::InfoAdder(InfoComponent* com)
  72. {
  73.         this->_com = com;
  74. }

  75. void InfoAdder::SetInfoComponent(InfoComponent* com)
  76. {
  77.         this->_com = com;
  78. }

  79. InfoAdder::~InfoAdder()
  80. {
  81.         cout << "~InfoAdder" << endl;
  82.         delete this->_com;
  83.         this->_com = NULL;
  84. }

  85. bool InfoAdder::Operation()
  86. {

  87. }

  88. //////////////////////////////// RunQueueInfoAdder /////////////////////////////

  89. RunQueueInfoAdder::RunQueueInfoAdder(InfoComponent* com,QueueInfo &queueInfo,TaskType taskType):InfoAdder(com)
  90. {
  91.         m_queueInfo = &queueInfo;
  92.         m_taskType = taskType;
  93. }

  94. RunQueueInfoAdder::~RunQueueInfoAdder()
  95. {
  96.         cout << "~RunQueueInfoAdder" << endl;
  97. }

  98. bool RunQueueInfoAdder::Operation()
  99. {
  100.         this->_com->Operation();
  101.         this->AddBehavor();
  102. }

  103. bool RunQueueInfoAdder::AddBehavor()
  104. {
  105.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();
  106.        
  107.         if(!m_queueInfo->GetRunQueueMessage(*m_msgArry,m_taskType)){
  108.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetDpptRunQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  109.                 return false;
  110.         }

  111.         return true;
  112. }


  113. //////////////////////////////// WaitQueueInfoAdder /////////////////////////////

  114. WaitQueueInfoAdder::WaitQueueInfoAdder(InfoComponent* com,QueueInfo &queueInfo,TaskType taskType):InfoAdder(com)
  115. {
  116.         m_queueInfo = &queueInfo;
  117.         m_taskType = taskType;
  118. }

  119. WaitQueueInfoAdder::~WaitQueueInfoAdder()
  120. {
  121.         cout << "~RunQueueInfoAdder" << endl;
  122. }

  123. bool WaitQueueInfoAdder::Operation()
  124. {
  125.         this->_com->Operation();
  126.         this->AddBehavor();
  127. }

  128. bool WaitQueueInfoAdder::AddBehavor()
  129. {
  130.         LoggerWrapper dsLog= LoggerWrapper::GetInstance();

  131.         if(!m_queueInfo->GetWaitQueueMessage(*m_msgArry,m_taskType)){
  132.                 dsLog.Log(true,LOGGER_ERROR,"%s:%s:%d   GetWaitQueueMessage error.\n",__FILE__,__PRETTY_FUNCTION__,__LINE__);
  133.                 return false;
  134.         }

  135.         return true;
  136. }



 楼主| keer_zu 发表于 2016-4-20 21:28 | 显示全部楼层
以上动态获取信息完成后,如果再有新的信息加入,我只要增加新的InfoAdder就可以了。具体的InfoAdder中关注获取的信息细节,但是InfoAdder本身是不关注这些的。
 楼主| keer_zu 发表于 2016-4-21 11:25 | 显示全部楼层
修改了两处: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。


 楼主| keer_zu 发表于 2016-4-21 11:27 | 显示全部楼层
测试结果(第一项,写入文件):

20160421112122.jpg

可以看到,成了所需文件,文件内容正确。


 楼主| keer_zu 发表于 2016-4-21 11:28 | 显示全部楼层
测试结果(第二项,从产生的文件中读取,存入Vector容器):

20160421112004.jpg

OK
 楼主| keer_zu 发表于 2016-5-4 09:52 | 显示全部楼层
和新的可以做些对比。
 楼主| keer_zu 发表于 2016-5-12 10:37 | 显示全部楼层
新的设计参看3
 楼主| keer_zu 发表于 2020-4-24 13:28 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1493

主题

12963

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部