现在的位置: 首页 > 综合 > 正文

模块间互相调用的一种方法

2012年10月21日 ⁄ 综合 ⁄ 共 6253字 ⁄ 字号 评论关闭

模块间互相调用的一种方法

在程序设计中,需要把程序根据功能划分多个模块,多个模块间免不了互相调用一些服务函数,这样会使模块间剪不断,理还乱!

利用服务中心的思想,可以使各个模块间的关系比较简单。模块间的调用通过中心服务器交换,彼此没有联系,这样模块间可以到达低耦合,高内聚。

实现方法:

中心服务器:

 

class BASEFRAME_CLASS CIVMDlgSrvMgr 

{

         typedef map<string,CIVMBaseSrv*> SRVMAP;

         typedef map<string,CIVMBaseSrv*>::iterator SRVMAPPtr;

        

         typedef map<CIVMBaseSrv*,CIVMBaseSrv*> DLGMAP;

         typedef map<CIVMBaseSrv*,CIVMBaseSrv*>::iterator DLGMAPPtr;

        

public:

         CIVMDlgSrvMgr();

         virtual ~CIVMDlgSrvMgr();

 

public:

         static CIVMDlgSrvMgr* Instance();

         // 注册一个服务

         bool RegService( string strSrvName, CIVMBaseSrv* pProvider );

         // 注销一个服务

         void UnRegService( string strSrvName );

         // 注销一个服务提供者

         void UnRegProvider( CIVMBaseSrv* pProvider );

         // 请求一个服务

         bool QueryService( IN CIVMMsg& msg, OUT CIVMMsg& result );

         // 注册一个窗口

         void RegDlg( CIVMBaseSrv* pDlg );

         // 注销一个窗口

         void UnRegDlg( CIVMBaseSrv* pDlg );

         //

         void CloseNoneVideoWnd();

         //

         void DiableAllWnd();

         //

         void EnableAllWnd();

         //

         CIVMBaseSrv* GetRegDlg( string strDlgClassName );

 

protected:

         SRVMAP m_srvMap;

         DLGMAP m_dlgMap;

 

};

在程序中,定一个中心服务器单体:

CIVMDlgSrvMgr* g_pSrvMgr = NULL;

 

CIVMDlgSrvMgr* g_pSrvMgr = NULL;

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

 

CIVMDlgSrvMgr::CIVMDlgSrvMgr()

{

 

}

 

CIVMDlgSrvMgr::~CIVMDlgSrvMgr()

{

 

}

 

CIVMDlgSrvMgr* CIVMDlgSrvMgr::Instance()

{

         if ( g_pSrvMgr == NULL )

         {

                   g_pSrvMgr = new CIVMDlgSrvMgr();

                   ASSERT( g_pSrvMgr );

         }

 

         return g_pSrvMgr;

}

 

// 注册一个服务

bool CIVMDlgSrvMgr::RegService( string strSrvName, CIVMBaseSrv* pProvider )

{

         m_srvMap[strSrvName] = pProvider;

         return true;

}

 

// 注销一个服务

void CIVMDlgSrvMgr::UnRegService( string strSrvName )

{

         m_srvMap.erase(strSrvName);

}

        

// 注销一个服务提供者

void CIVMDlgSrvMgr::UnRegProvider( CIVMBaseSrv* pProvider )

{

         SRVMAPPtr itSrv = m_srvMap.begin();

         for ( ; itSrv != m_srvMap.end(); itSrv++ )

         {

                   if ( itSrv->second == pProvider )

                   {

                            itSrv = m_srvMap.erase( itSrv );

                   }

         }

}

 

// 请求一个服务

//用户需要调用另外一个模块的服务函数时,调用该函数。前提是:另外一个模块提供了这个服务函数,并向中心服务器注册了该函数,如何注册,下面会做介绍。

bool CIVMDlgSrvMgr::QueryService(IN CIVMMsg& msg, OUT CIVMMsg& result)

{

         string strQuerySrvName = msg.GetMsgName();

         CIVMBaseSrv* pSrvProvider = m_srvMap[strQuerySrvName];

         if ( pSrvProvider == NULL )

         {

                   return false;

         }

 

         return pSrvProvider->OnQueryMsg( msg, result );

}

 

// 注册一个窗口

void CIVMDlgSrvMgr::RegDlg( CIVMBaseSrv* pDlg )

{

         m_dlgMap[pDlg] = pDlg;

}

 

// 注销一个窗口

void CIVMDlgSrvMgr::UnRegDlg( CIVMBaseSrv* pDlg )

{

         DLGMAPPtr itDlg = m_dlgMap.begin();

         for ( ; itDlg != m_dlgMap.end(); itDlg++ )

         {

                   if ( itDlg->second == pDlg )

                   {

                            m_dlgMap.erase( itDlg );

                           

                            break;

                   }

         }

}

 

CIVMBaseSrv* CIVMDlgSrvMgr::GetRegDlg( string strDlgClassName )

{

         CIVMBaseDlg* pDlg = NULL;

         DLGMAPPtr itDlg = m_dlgMap.begin();

         for ( ; itDlg != m_dlgMap.end(); itDlg++ )

         {

                   pDlg = (CIVMBaseDlg*)(itDlg->second);

                   if ( pDlg && pDlg->m_strDlgName == strDlgClassName )

                   {

                            return pDlg;

                   }

         }

 

         return NULL;

}

 

void CIVMDlgSrvMgr::DiableAllWnd()

{

         CIVMBaseDlg* pWnd= NULL;

         DLGMAPPtr itDlg = m_dlgMap.begin();

         for ( ; itDlg != m_dlgMap.end(); itDlg++ )

         {

                   pWnd = (CIVMBaseDlg*)itDlg->second;

                   if ( pWnd && IsWindow(pWnd->m_hWnd) )

                   {

                            pWnd->EnableWindow(FALSE);

                   }

         }

}

 

void CIVMDlgSrvMgr::EnableAllWnd()

{

         CIVMBaseDlg* pWnd= NULL;

         DLGMAPPtr itDlg = m_dlgMap.begin();

         for ( ; itDlg != m_dlgMap.end(); itDlg++ )

         {

                   pWnd = (CIVMBaseDlg*)itDlg->second;

                   if ( pWnd && IsWindow(pWnd->m_hWnd) )

                   {

                            pWnd->EnableWindow(TRUE);

                   }

         }

}

 

//

void CIVMDlgSrvMgr::CloseNoneVideoWnd()

{

         CIVMBaseDlg* pWnd= NULL;

         DLGMAPPtr itDlg = m_dlgMap.begin();

         for ( ; itDlg != m_dlgMap.end(); itDlg++ )

         {

                   pWnd = (CIVMBaseDlg*)itDlg->second;

                   if ( pWnd && IsWindow(pWnd->m_hWnd) && pWnd->m_strDlgName != "CIVMMonitorDlg")

                   {

                            pWnd->SendMessage(WM_CLOSE);

                   }

         }

}

 

模块基类:

         模块需要继承一个统一接口,向中心服务器注册自己提供的服务函数,和调用中心服务器提供的接口来调用其他模块的函数。

基类定义:

//////////////////////////////////////////////////////////////////////////

// 服务类接口

class BASEFRAME_CLASS CIVMBaseSrv

{

public:

         CIVMBaseSrv(){};

         ~CIVMBaseSrv(){};

 

         // 服务响应函数

         virtual bool OnQueryMsg( CIVMMsg& msg, CIVMMsg& result );

 

         // 获取提供的服务名列表

         virtual bool GetSrvList( list<string>& srvList ){ return false; }

 

protected:

         // 注册自己的服务

         virtual bool RegistThisSrv()

         {

                   bool bRet = true;

                   list<string> srvList;

                   if ( GetSrvList(srvList) )

                   {

                            list<string>::iterator itSrv = srvList.begin();

                            for ( ; itSrv != srvList.end(); itSrv++ )

                            {

                                     bRet &= CIVMDlgSrvMgr::Instance()->RegService( *itSrv, this );

                            }

                   }

                  

                   return bRet;

         }

 

         // 注销自己的服务

         virtual void UnRegistThisSrv()

         {

                   CIVMDlgSrvMgr::Instance()->UnRegProvider( this );

         }

};

 

模块使用中心服务器互相调用的方法:

1.       模块要继承基类CIVMBaseSrv

2.       在启动模块时,调用     

// 注册窗口提供的服务

RegistThisSrv();

并实现:

// 获取提供的服务名列表

bool CIVMEQMainDlg::GetSrvList( list<string>& srvList )

{

if ( m_bHasRecSrv == false )

{

           return false;

}

srvList.push_back( SRV_EQ_STATUS );

srvList.push_back( SRV_EQ_FRESH );

srvList.push_back( SRV_EQ_CLEAR );

#ifdef _DIANLI_SMS_

srvList.push_back( SRV_SMTK_CONTROL_CYCLE );

#endif

 

return true;

}

来注入自己提供的服务名称。

3.       实现自己提供的服务函数

4.       // 服务响应函数

bool CIVMEQMainDlg::OnQueryMsg( CIVMMsg& msg, CIVMMsg& result )

{

         IVMFUNCTRACE("CIVMEQMainDlg::OnQueryMsg");

 

         int nRecID = 0;

         string strMsgName = msg.GetMsgName();

抱歉!评论已关闭.