注册机制

 

一谈到注册机制,这个大家不是很陌生,因为我们现行的户口身份注册制、企业工商注册制度、股票中的注册制等等都是一种注册方式,其实我们经常都在处理这些繁琐的注册,但是在软件开发中,我们就不大会用这种机制了,然而这种机制是让代码具有灵活性的最好方式。或者说是我们进行软件解耦经常用的招数。Observer模式其实就是一个生动的例子。

C++实现多态的实现也是通过注册机制进行的,下面我们简要说明一下这种方式为我们带来的可扩展方面的意义,以及我们以后如果需要实现类似的东西该如何处理。

所谓多态就是同一种操作的不同的实现,C++多态是通过动态运行中,对函数指针的地址进行不同赋值,而达到多态实现。而这种方式也是一种注册的方式,只是这个注册需要编译器完成机制,在运行时候才能完成。

通用的C++编译器都常用如下的技术实现,如图3-3所示:

 blob.png  图3-3

当实现具体的继承类,其类的成员函数的地址就会给&Fun1赋上。

下面我们看我们是如何应用这个注册方式。

在系统中我们分为上下两个层次,而需要将上层作为一个默认的实现,下层作为一个可更换的实现,刚开始我就想是否通过函数的注册看我们是如何通过注册的方式进行中断程序代码的处理。

虽然,上面所见的注册机制的应用都是基于动态方式进行,然而,注册机制也体现在于静态系统中,其实将一个类继承加入到一个继承体系中也是一种注册的方式,而这种注册的方式就是静态的处理方式,只是静态注册方式与动态注册方式存在一些不同之处,静态注册方式需要满足接口和约束,在继承一个接口和具体类的过程中,要求此类必须声明和实现接口函数,并且限制其虚成员函数名称、参数、返回值等都必须保存一致,满足Liskov替换原则,子类必须能够替换其基类等等,这样就可以通过根据创建将其类对应的对象统一使用,并达到具体和抽象的统一。

仿佛注册的只能出现在编码过程,这绝对是一个误解,对于注册机制来说是在不同层次上进行不同方式的展现,例如对于一个庞大的系统来说,不是任何组件就一次到位,而是需要具有可拆卸的不同部件组成,而这些不同的可拆卸的部件就是一个个需要具有注册和注销功能的模块,而只有这些具有可拆卸的部件,才能最终形成行业化,所以不要小看一个动态库(dll),也许就是这样的动态库,增加了灵活性 ,也增加了产品的竞争力。试想一下,如果你正在开发一个系统,这个系统的某些组件不是一下子就能完成的,可能需要购买或者后续进行开发,但是如何满足这些组件能够合适的应用于你当前的系统,那么你的骨干就必须是一个具有注册机制的体系,当部分组件完成后就可以组装,当不需要的时候可以进行卸载。

所以上面可以看出,注册机制其实是在满足一定限制条件下,能够进行灵活的注册和注销操作,并形成统一的特征操作,让使用者能够通过集合化的方式进行访问的一整套系统都可以统称为“注册机制”。

通过上面的例子我们可以说明,注册机制是解决耦合的最佳方式之一,是将发起者和执行者分离,在上面的注册机制中其实我们还可以做很多处理,例如在统一注册的地方我们设置安全策略进行安全方面的校验,或者为了提高速度进行不同方面的分发消息。是一对多的处理而不是一对全的处理。

VCL架构中其实是使用动态方法(dynamic method)来实现注册处理,这类似于虚拟方法,但可减少虚函数列表大小,但执行效率比虚函数方法缓慢一点。

一些delphi的编译器,会把经常调用的虚拟函数方法留在缓冲器中进一步提高执行效率,如图3-4所示

 blob.png

spacer.gifspacer.gifspacer.gifspacer.gifspacer.gifspacer.gifspacer.gifspacer.gifspacer.gifspacer.gifspacer.gifspacer.gifspacer.gifspacer.gifspacer.gif 

3-4


注册机制在架构中的广泛应用,对于存在全局函数的接口,我们如何做到兼容,这里使用注册机制来帮组我们解决这个问题。

在前面我们看到的注册的例子就是一个表驱动的例子,也就是说,可以通过使用表的数据结构代替我们的判断操作。

但是并不仅仅只有表驱动才能达到效果,其实composite模式就是一个使用树形结构代替算法处理,只是我们要将类也要看成一个数据结构。而且这种数据结构同时还带有操作。

由此可以看出数据结构和算法是相互独立,但是可以互换互补的两种载体,有时候我们使用数据结构来代替算法的复杂性,有时候我们使用算法来代替数据结构的复杂性,这在架构设计的时候非常重要。