C++中组件管理器的一个实现

来源:互联网 发布:ssm项目管理系统源码 编辑:程序博客网 时间:2024/05/18 18:17

在软件开发中,网络上很多都认为编程一件体力活动,出入茅庐,俺也一直这么认为。虽然说编程是一个熟练程度的问题,但我认为,为什么不把它当着一门艺术,写歌的也好,唱歌的也好,认真用自己的大脑做出的事情才是最好的。写程序也好,为什么同是一个功能,较两个熟练的人写出来的代码却可能完全不一样,表现在那儿呢?

         代码的可读性,对代码组织好的,写出来的东西,逻辑清晰,有条不紊。要知道代码并不只是你一个人在研读,就算是研读,时间长后你可能也会忘记,更何况是别人呢?;代码的架构,这里我说的是架构而不是结构,可能别人会在这里专牛角尖!好的程序号码,不仅结构清晰,而且架构更是灵活,易于扩展!说了这么多废话,总算转到本文正题了。

         软件重要的是对整个系统宏观掌控上,一个好的软件应该应有坚实的体系结构来支撑,这对软件的开发以及后期的维护都将是一个直接成本上的核算。那么我们可能会设想:有没有这样一个系统,它只是一个框架,它提供的功能相当于一个容器,然后对容器中被激活的组件完成调用和相关的管理。事实上,现在有很多这样的成熟框架系统,本文不打算去介绍哪些框架系统(俺知道的也没那么多,精力也不够,还是留着点,哈哈)。现在,我们用C++来讨论一下如何实现这么一个组件容器,它应该实现如下功能:1。能够装载组件;2。能够启动组件,调用组件来完成相应的功能;3:在组件不用的时候,能够把组件从容器移出,停止其所执行的一切功能。

          根据上面描述的,怎么用C++一般类来实现这一功能呢?框架中要对置身于其中的组件实行统一的调用,那么对其中的组件应该做如下的限制:应该有统一的接口。不错,容器的组件应该有统一的接口,这样框架系统在调用组件的时候就不必知道它要调用那一类具体的组件,只需要执行组件实现的一般性通用接口即可。这和JAVA中Applet初始化启动的原理是相似的。好了,到这里我们知道了实现的思路,下面用C++来说明具体的实现。

          上面提到了通用的公共接口,那么,首先我们要实现这么一个文件(.h),定义这一系列通用接口。根据上面的分析,此文件至少应该包含这么几个接口:初始化组件;启动组件;停止组件;删除组件。当然根据具体需要,你还可以加入其它的接口,比如暂停等。我们把这个文件命名为:RNConponent.h,记住,里面的接口都是纯虚函数。

           然后定义个组件池的管理类,此类主要完成容器中组件的管理,其应该完成如下功能:增加一个组件;移出一个组件;查找指定名称或ID的组件;显示容器中组件的相关信息。此文件我们命名为:RNConponent_Pool.h。

           最后定义个组件容器管理类,这个类组要完成如下功能:根据提供的脚本文件对其内容进行解析处理(此脚本文件记录了待挂接的组件的信息,当然也可以采用其它方式实现);取得一个组件池的引用(这里假定可以管理多个组件池,但是一般只有一个),此文件命名为:RNConponent_Manager.h,到这里,我们完成整个系统的关键部分的文件以及接口实现的定义。下面阐述一下怎么样来完成一个具体的组件以及对其的加载和调用。

           上面说了,没一个组件都必须实现框架调用的公共接口,也就是文件RNConponent.h中定义的接口。所以,一个具体的组件,大概是这个样子的:

           class YourConponent : public RNConponent
           {           
           public: 
            YourConponent();
            virtual ~YourConponent();

            /******** 初始化组件
            * 参数:arv-参数个数;arg[]-参数数组
            * 返回值:成功返回0;否则非0
            *********/
            virtual int InitConponent(int arv,char *arg[]);
            /******** 运行组件
            * 参数:无
            * 返回值:成功返回0;否则非0
            *********/
            virtual int Start();
            /******** 对组件执行退出操作以释放资源
            * 参数:无
            * 返回值:成功返回0;否则非0
            *********/
            virtual int FiniComponent();
           };

          组件以一个动态库实现,动态库只有一个输出接口:返回RNConponent类型的组件指针。

          注意:这种对组件的加载有个缺点(有时候可能是致命的),需要对取得组件对象进行强制类型转换

          到这里完成了整个系统的分析,这是几年前本人工作时完成的一个小系统,我这里有相关的源码实现,不是很完善,可能对于新手会有用,有需要的可以和我联系:EMail:Rohna.w@163.com

0 0