一、反射说明
在一个应用或系统中,希望实现一种结构或框架:在主体不做任何修改的情况下添加一些模块(基于框架的新功能)。
1、要求
class CWorkBase
{
public:
CWorkBase();
~CWorkBase();
public:
virtual void WorkProc();
}
应用需要调用基于CWorkBase的不同功能的WorkProc实体,希望实现在不修改应用或其他功能的情况下将新模块的功能注册到应用中。
2、实现原理
(1)实现一个单例的类
class Classfactory
{
private:
Classfactory();
public:
void registerClass(string strName, CWorkBase* pObj)
{
m_mapWoker[strName] = pObj;
}
CWorkBase* GetObj(string strName)
{
return m_mapWoker.find(strName)->second;
}
static Classfactory GetInstance()
{
static Classfactory mObj;
return mObj;
}
public:
map<string, CWorkBase*> m_mapWoker;
}
(2)实现一个类,这个类的构造函数实现Classfactory类的注册功能registerClass
class AcitonRegister
{
public:
AcitonRegister(string strName, CWorkBase* pObj)
{
Classfactory::GetInstance().registerClass(strName, pObj);
}
}
(3)在CWorkBase子类的cpp文件中定义一个AcitonRegister的全局对象,通过全局对象的构造过程将CWorkBase子类注册到Classfactory单例中,应该程序无须修改通过Classfactory即可获取所有新添加的方法。
(4)通过宏实现定义AcitonRegister全局对象,之后通过宏REGISTER_CLASS(className)就可以实现注册新模块
#define REGISTER_CLASS(className) AcitonRegister g_AcitonRegister##className(\
#className, (CWorkBase*)new className())