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

时间:2022-05-05 12:20:38

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

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

实现方法:

中心服务器:

 
 
  1. class BASEFRAME_CLASS CIVMDlgSrvMgr  
  2.          typedef map<string,CIVMBaseSrv*> SRVMAP; 
  3.          typedef map<string,CIVMBaseSrv*>::iterator SRVMAPPtr; 
  4.          typedef map<CIVMBaseSrv*,CIVMBaseSrv*> DLGMAP; 
  5.          typedef map<CIVMBaseSrv*,CIVMBaseSrv*>::iterator DLGMAPPtr; 
  6. public: 
  7.          CIVMDlgSrvMgr(); 
  8.          virtual ~CIVMDlgSrvMgr(); 
  9. public: 
  10.          static CIVMDlgSrvMgr* Instance(); 
  11.          // 注册一个服务 
  12.          bool RegService( string strSrvName, CIVMBaseSrv* pProvider ); 
  13.          // 注销一个服务 
  14.          void UnRegService( string strSrvName ); 
  15.          // 注销一个服务提供者 
  16.          void UnRegProvider( CIVMBaseSrv* pProvider ); 
  17.          // 请求一个服务 
  18.          bool QueryService( IN CIVMMsg& msg, OUT CIVMMsg& result ); 
  19.          // 注册一个窗口 
  20.          void RegDlg( CIVMBaseSrv* pDlg ); 
  21.          // 注销一个窗口 
  22.          void UnRegDlg( CIVMBaseSrv* pDlg ); 
  23.          // 
  24.          void CloseNoneVideoWnd(); 
  25.          // 
  26.          void DiableAllWnd(); 
  27.          // 
  28.          void EnableAllWnd(); 
  29.          // 
  30.          CIVMBaseSrv* GetRegDlg( string strDlgClassName ); 
  31. protected: 
  32.          SRVMAP m_srvMap; 
  33.          DLGMAP m_dlgMap; 
  34. }; 

 

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

 
 
  1. CIVMDlgSrvMgr* g_pSrvMgr = NULL; 
  2. CIVMDlgSrvMgr* g_pSrvMgr = NULL;  
  3.  
  4. CIVMDlgSrvMgr::CIVMDlgSrvMgr() 
  5.  
  6. CIVMDlgSrvMgr::~CIVMDlgSrvMgr() 
  7. CIVMDlgSrvMgr* CIVMDlgSrvMgr::Instance() 
  8.          if ( g_pSrvMgr == NULL ) 
  9.          { 
  10.                    g_pSrvMgr = new CIVMDlgSrvMgr(); 
  11.                    ASSERT( g_pSrvMgr ); 
  12.          } 
  13.          return g_pSrvMgr; 
  14.  
  15. // 注册一个服务 
  16. bool CIVMDlgSrvMgr::RegService( string strSrvName, CIVMBaseSrv* pProvider ) 
  17.          m_srvMap[strSrvName] = pProvider; 
  18.          return true; 
  19.  
  20. // 注销一个服务 
  21. void CIVMDlgSrvMgr::UnRegService( string strSrvName ) 
  22.          m_srvMap.erase(strSrvName); 
  23.          
  24. // 注销一个服务提供者 
  25. void CIVMDlgSrvMgr::UnRegProvider( CIVMBaseSrv* pProvider ) 
  26.          SRVMAPPtr itSrv = m_srvMap.begin(); 
  27.          for ( ; itSrv != m_srvMap.end(); itSrv++ ) 
  28.          { 
  29.                    if ( itSrv->second == pProvider ) 
  30.                    { 
  31.                             itSrv = m_srvMap.erase( itSrv ); 
  32.                    } 
  33.          } 
  34.   
  35. // 请求一个服务 
  36. //用户需要调用另外一个模块的服务函数时,调用该函数。前提是:
  37. //另外一个模块提供了这个服务函数,并向中心服务器注册了该函数
  38. //,如何注册,下面会做介绍。 
  39. bool CIVMDlgSrvMgr::QueryService(IN CIVMMsg& msg, OUT CIVMMsg& result) 
  40.          string strQuerySrvName = msg.GetMsgName(); 
  41.          CIVMBaseSrv* pSrvProvider = m_srvMap[strQuerySrvName]; 
  42.          if ( pSrvProvider == NULL ) 
  43.          { 
  44.                    return false; 
  45.          } 
  46.          return pSrvProvider->OnQueryMsg( msg, result ); 
  47.  
  48. // 注册一个窗口 
  49. void CIVMDlgSrvMgr::RegDlg( CIVMBaseSrv* pDlg ) 
  50.          m_dlgMap[pDlg] = pDlg; 
  51.  
  52. // 注销一个窗口 
  53. void CIVMDlgSrvMgr::UnRegDlg( CIVMBaseSrv* pDlg ) 
  54.          DLGMAPPtr itDlg = m_dlgMap.begin(); 
  55.          for ( ; itDlg != m_dlgMap.end(); itDlg++ ) 
  56.          { 
  57.                    if ( itDlg->second == pDlg ) 
  58.                    { 
  59.                             m_dlgMap.erase( itDlg ); 
  60.                             break; 
  61.                    } 
  62.          } 
  63.  
  64. CIVMBaseSrv* CIVMDlgSrvMgr::GetRegDlg( string strDlgClassName ) 
  65.          CIVMBaseDlg* pDlg = NULL; 
  66.         DLGMAPPtr itDlg = m_dlgMap.begin(); 
  67.          for ( ; itDlg != m_dlgMap.end(); itDlg++ ) 
  68.          { 
  69.                    pDlg = (CIVMBaseDlg*)(itDlg->second); 
  70.                    if ( pDlg && pDlg->m_strDlgName == strDlgClassName ) 
  71.                    { 
  72.                             return pDlg; 
  73.                    } 
  74.          } 
  75.          return NULL; 
  76. void CIVMDlgSrvMgr::DiableAllWnd() 
  77.          CIVMBaseDlg* pWnd= NULL; 
  78.          DLGMAPPtr itDlg = m_dlgMap.begin(); 
  79.          for ( ; itDlg != m_dlgMap.end(); itDlg++ ) 
  80.          { 
  81.                    pWnd = (CIVMBaseDlg*)itDlg->second; 
  82.                    if ( pWnd && IsWindow(pWnd->m_hWnd) ) 
  83.                    { 
  84.                             pWnd->EnableWindow(FALSE); 
  85.                    } 
  86.          } 
  87.  
  88. void CIVMDlgSrvMgr::EnableAllWnd() 
  89.          CIVMBaseDlg* pWnd= NULL; 
  90.          DLGMAPPtr itDlg = m_dlgMap.begin(); 
  91.          for ( ; itDlg != m_dlgMap.end(); itDlg++ ) 
  92.          { 
  93.                    pWnd = (CIVMBaseDlg*)itDlg->second; 
  94.                    if ( pWnd && IsWindow(pWnd->m_hWnd) ) 
  95.                    { 
  96.                             pWnd->EnableWindow(TRUE); 
  97.                    } 
  98.          } 
  99.  
  100. // 
  101. void CIVMDlgSrvMgr::CloseNoneVideoWnd() 
  102.          CIVMBaseDlg* pWnd= NULL; 
  103.          DLGMAPPtr itDlg = m_dlgMap.begin(); 
  104.          for ( ; itDlg != m_dlgMap.end(); itDlg++ ) 
  105.          { 
  106.                    pWnd = (CIVMBaseDlg*)itDlg->second; 
  107.                    if ( pWnd && IsWindow(pWnd->m_hWnd)
  108.  && pWnd->m_strDlgName != "CIVMMonitorDlg") 
  109.                    { 
  110.                             pWnd->SendMessage(WM_CLOSE); 
  111.                    } 
  112.          } 


本站遵循Creative Commons Attribution 3.0 License,所有文章欢迎任何形式的转载,但请注明作者及出处,尊重他人劳动成果!
文章转载自:罗索工作室 [http://www.rosoo.net]
本文标题:模块间互相调用的一种方法
本文作者:lovezncu 本文来源:CSDN博客
本文地址:http://www.rosoo.net/a/201103/11021.html