界面组合SDK中Hook机制实现原理2011-08-21 博客园 道法自然在前一篇简要介绍了基于Flex的界面组合SDK,其中使用Hook机制实现UI Part生命周期管理、 Master-Details关系构建和UI Part注入。Hook即钩子,其作用可以理解为通过透明的方式为某一对象挂 上额外的功能,从而实现透明扩展。Hook机制可以应用于各种平台,不限语言,其传递的是一种思想。 利用Hook机制实现这些功能的最大优点是,在提供这些功能的同时不增加用户复杂性,它能够完全兼容 基于Flex组件的设计,使用户丝毫感觉不出来我们正在使用SDK。也就是说,这种Hook机制的引入,该 SDK提供的功能对开发人员是完全透明的,这个想法很酷。不过,没有任何解决方案是完美的,这种Hook 机制在资源释放、事件捕捉时,需要按一定顺序,控制这些顺序对SDK维护人员要求比较高,一不注意, 就会出现莫名其妙的错误。此外,Hook机制实现稍微困难一点。下图是Hook机制实现类图。

IDisposable 接口借鉴与微软内存管理模型,Adobe Flex在内存管理和GC方面做得非常粗糙,其SDK 内存泄漏很多,在模块化应用中,内存泄漏尤其严重。因此,我在设计该SDK的时候,引入了微软的一些 内存管理思路,不过,根据需要做了一点变化。该SDK内存释放分为2个阶段,第一个阶段有preDispose 函数实现,用于释放类实例间依赖,第二阶段是postDispose函数实现,用于释放实例引用。所有的Hook 都实现了IDisposable接口,可以实现内存释放。IComponentHook 继承于IDisposable接口,定义了一个Hook的基本接口,由compositionManager、 component、isHooked属性和hook、unHook方法组成,分别用于表示组合管理器、Hook挂载的组件、是否 挂载和执行挂载、执行卸载。ComponentHook是所有Hook基类,它直接实现了compositionManager、component、isHooked属性的定 义,并且在hook方法和unHook方法中设置了挂载的组件和isHooked属性。