发新帖本帖赏金 3.00元(功能说明)我要提问
返回列表
打印

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

[复制链接]
2463|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2016-4-19 13:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 keer_zu 于 2016-4-19 13:12 编辑



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



打赏榜单

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 编辑

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

///////////////////////////////////// TransTaskDpManager ///////////////////////////////



bool TransTaskDpManager::WriteInfoToFile(DpMessageArryType &dpMsg)
{
        unsigned short size;
        //DpMessageType *msg;
        char buf[1024];
        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[0] = size/256;
        buf[1] = size%256;

        fwrite(buf, 1, 2, fp);

        string strMsg;
        for(i = 0;i < size;i ++){
                //msg = dpMsg[i];
                strMsg = BuildJsonStr(dpMsg[i]);

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

                dsLog.Log(true,LOGGER_INFO,"strMsg:%s, %s:%s:%d   \n",strMsg.c_str(),__FILE__,__PRETTY_FUNCTION__,__LINE__);
               
                buf[0] = strMsg.length()/256;
                buf[1] = 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[2096];
        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();
        DpMessageArryType  dpMsgArry;
       
        return GetInfoAndWriteToFile(dpMsgArry);
}


bool TransTaskDpManager::CreateDpFile(const DpMessageType &dpMsg)
{
        DpMessageArryType  dpMsgArry;
        //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)
{

}

使用特权

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

从上面我的代码的修改痕迹来看,我是要把数据写入的内容放到子类里面,用多态来支持多种数据内容。同时支持数据内容的增加。

使用特权

评论回复
6
keer_zu|  楼主 | 2016-4-20 09:25 | 只看该作者
哦,对了,上面几个类的定义如下:

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);
};

使用特权

评论回复
7
eyesee2008| | 2016-4-20 11:25 | 只看该作者

使用特权

评论回复
8
洛理小子| | 2016-4-20 12:39 | 只看该作者
来学习~~~

使用特权

评论回复
9
皈依| | 2016-4-20 20:44 | 只看该作者
好厉害的样子~

使用特权

评论回复
10
keer_zu|  楼主 | 2016-4-20 21:15 | 只看该作者
经过一天,这部分现在改成这样了,类的定义:

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);
       
};

使用特权

评论回复
11
keer_zu|  楼主 | 2016-4-20 21:16 | 只看该作者
函数实现部分:

DataPresistence& DataPresistence::GetInstance(IQueueUser *queueUser)
{
        static  DataPresistence 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[1024];
        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[0] = size/256;
        buf[1] = size%256;

        fwrite(buf, 1, 2, fp);

        string strMsg;
        for(i = 0;i < size;i ++){
                //msg = dpMsg[i];
                strMsg = BuildJsonStr(dpMsg[i]);

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

                dsLog.Log(true,LOGGER_INFO,"strMsg:%s, %s:%s:%d   \n",strMsg.c_str(),__FILE__,__PRETTY_FUNCTION__,__LINE__);
               
                buf[0] = strMsg.length()/256;
                buf[1] = 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[2096];
        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();
        DpMessageArryType  dpMsgArry;
       
        return GetInfoAndWriteToFile(dpMsgArry);
}


bool TransTaskDpManager::CreateDpFile(QueueType qt)
{
        LoggerWrapper dsLog= LoggerWrapper::GetInstance();
        DpMessageArryType  dpMsgArry;
       
        return GetInfoAndWriteToFile(dpMsgArry,qt);
}


bool TransTaskDpManager::CreateDpFile(const DpMessageType &dpMsg)
{
        DpMessageArryType  dpMsgArry;
        //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;
}
*/




使用特权

评论回复
12
keer_zu|  楼主 | 2016-4-20 21:22 | 只看该作者
你会发现,原来在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;
};


使用特权

评论回复
13
keer_zu|  楼主 | 2016-4-20 21:25 | 只看该作者
其中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;
}



使用特权

评论回复
14
keer_zu|  楼主 | 2016-4-20 21:28 | 只看该作者
以上动态获取信息完成后,如果再有新的信息加入,我只要增加新的InfoAdder就可以了。具体的InfoAdder中关注获取的信息细节,但是InfoAdder本身是不关注这些的。

使用特权

评论回复
15
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。


使用特权

评论回复
16
keer_zu|  楼主 | 2016-4-21 11:27 | 只看该作者
测试结果(第一项,写入文件):



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


使用特权

评论回复
17
keer_zu|  楼主 | 2016-4-21 11:28 | 只看该作者
测试结果(第二项,从产生的文件中读取,存入Vector容器):



OK

使用特权

评论回复
18
keer_zu|  楼主 | 2016-5-4 09:52 | 只看该作者
和新的可以做些对比。

使用特权

评论回复
19
keer_zu|  楼主 | 2016-5-12 10:37 | 只看该作者
新的设计参看3

使用特权

评论回复
20
keer_zu|  楼主 | 2020-4-24 13:28 | 只看该作者
设计

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1304

主题

12237

帖子

53

粉丝