martin

thinking

常用链接

统计

software

最新评论

应用的扩展

实体(语言内建的数据类型,开发者定义的类和方法等)的定义与声明,实体和指针跟程序设计带来了不同影响.
对于实体或定义,编译器要知道实体真实的物理内存布局,因此让编译器知道这些信息,并且在程序编译完毕后不能更改.要想更改必须重新编译程序.因此如果在系统设计者程序库中运用了inline函数,并且如果应用开发者在应用中用了这个inline函数,则当后来要对inline进行修改时,有可能要导致应用被重新编译.
对于指针,它的大小在特定的机器上是固定的(在32位机器上,它的大小是32位;在64位机器上,它的大小是64位).因此可以改变它的值,而不需要重新编译应用,就可以改变应用的功能.

在面向对象中,可以通过虚函数指针来延迟特定函数的决策,即调用子类的函数.
在C语言中,我们可以通过函数指针来对函数的功能进行推迟决策.
在C++中,我们也可以通过函数指针(函数对象)、对象指针来推迟决策,从而使程序的功能更有弹性。例如,在设计模式中的strategy模式中,就是通过在contex中包含一个指向strategy的指针来实现的。我们可以定义一个抽象的strategy接口,然后由各个具体的strategy实现这些接口,从而在保证应用架构几乎不做任何调整下,实现不同的功能。当然在这种实现方式中,我们应该加入strategy的决议者,由它来裁决采用哪一种策略方式。决议者可以采用配置文件、应用的输入等作为决议的依据。

熟悉symbian的人,很快就会发现:它与symbian中的ECOM架构很相似。它要求各种strategy的实现方式被包含在共享的DLL中,并由RLibrary::Loard()调用动态载入.
使用定义抽象接口,然后在各DLL中定义具体的实现,并且动态载入,我们可以比较容易地实现所谓的插件(plugin)。插件的载入取决于配置,或相应的输入检测。

下面给出在linux和windows上从动态库中查找和载入的例子:
#ifdef WIN32
        HINSTANCE hDll;
        if(!(hDll = LoadLibrary(VOCALSIP_DLLPATH)))
        adapter.m_initFunc = (INIT_PROTOSTACK_FUNC)GetProcAddress( hDll, "InitVocalSipStack");
        adapter.m_createFunc = (CREATE_CHANNEL_FUNC)GetProcAddress( hDll, "CreateVocalSipGCChannel");
        adapter.m_cleanupFunc = (CLEANUP_PROTOSTACK_FUNC)GetProcAddress( hDll, "CleanupVocalSipStack");
#else
        void* h_dl = dlopen(VOCALSIP_DLLPATH,RTLD_NOW | RTLD_GLOBAL);
        adapter.m_initFunc = (INIT_PROTOSTACK_FUNC)dlsym( h_dl, "InitVocalSipStack");
        adapter.m_createFunc = (CREATE_CHANNEL_FUNC)dlsym( h_dl, "CreateVocalSipGCChannel");
        adapter.m_cleanupFunc = (CLEANUP_PROTOSTACK_FUNC)dlsym( h_dl, "CleanupVocalSipStack");
#endif

posted on 2009-03-20 11:41 martin_yahoo 阅读(1274) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理