创建扩展性良好的框架-(通知\单例\插件)框架

面向外部的接口:

#pragma once
#include <functional>
#ifdef CORECENTER_EXPORTS
#define CORECENTER_EXPORTS __declspec(dllexport)
#else
#define CORECENTER_EXPORTS
#endif
extern "C"
{
	CORECENTER_EXPORTS int   GetInterfaceCount(const char* strNotify);
	CORECENTER_EXPORTS void* GetInterface(const char* strNotify, int index);
	CORECENTER_EXPORTS void  AddInterface(const char* strNotify, void* pNotifyObject);
	CORECENTER_EXPORTS void  RemoveInterface(const char* strNotify, void* pNotifyObject);

	CORECENTER_EXPORTS void* GetCoreInstance(const char* strInterface);
	CORECENTER_EXPORTS void  AddCreateInstanceFunc(const char* strInterface, std::function<void*()> func);

	CORECENTER_EXPORTS void AddNotifyInstance(const char* strNotify, const char* strInterface);
	CORECENTER_EXPORTS void ActiveNotifyInstance(const char* strNotify);

	CORECENTER_EXPORTS void StartComponent();
}

//***********************************************************//
//************************ 通知接口 **************************//
//***********************************************************//

//注册通知
#define LISTEN(INotify)\
AddInterface(#INotify, (void*)(INotify*)this);

//去除通知
#define UNLISTEN(INotify)\
RemoveInterface(#INotify, (void*)(INotify*)this);

//分发通知
#define NOTIFY(INotify, function)\
ActiveNotifyInstance(#INotify);\
for(int i=0; i!= GetInterfaceCount(#INotify); ++i)\
{\
   INotify* pInterface = (INotify*)(GetInterface(#INotify, i));\
   if (nullptr != pInterface)\
      {\
      pInterface->function;\
      }\
}\


//***********************************************************//
//************************ 单例接口 **************************//
//***********************************************************//

//获取单例对象
#define GETINSTANCE(interface, object)\
{\
   object = (interface*)GetCoreInstance(#interface);\
}

//注册单例接口
#define REGINSTANCE(interface, CLASS)\
static auto interface##Func = []()\
{\
   static CLASS object;\
   return &object;\
};\
AddCreateInstanceFunc(#interface, interface##Func);

//通知拉活接口
#define REGNOTIFYINSTANCE(INotify, interface, CLASS)\
static auto interface##Func = []()\
{\
   static CLASS object;\
   return &object;\
};\
AddCreateInstanceFunc(#interface, interface##Func);\
AddNotifyInstance(#INotify, #interface);

//启动框架
#define STARTCOMPONENTSERVICE StartComponent();

扩展框架为了简洁以宏的形式向外暴露

通知框架:

通知框架有LISTEN,  UNLISTEN, NOTIFY三个宏接口组成,接受通知的对象需要用LISTEN注册自己感兴趣的接口,UNLISTEN可以取消接收通知。NOTIFY是用来发出通知的,参数有两个第一个是接口,第二个是接口的方法,主要LISTEN了这个接口的对象都可以收到通知。

 

单例框架:

REGINSTANCE, GETINSTANCE两个接口,第一个宏是用来注册单例对象的,参数由接口和实现了接口的class组成。第二个是用来获取单例对象的,参数为接口和接受单例的一个接口指针。

 

插件框架:

STARTCOMPONENTSERVICE是用来启动插件的,通俗讲就是加载dll,并且调用dll的统一初始化方法。

插件框架和单例框架搭配起来最好,一般在插件初始化时就调用REGINSTANCE将一些单例注册好,在使用时就可以随时调用

GETINSTANCE来获取单例对象。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章