将组件思想推广的最出名的应该算是微软的COM技术了。组件技术的核心思想是将软件划分成一个个独立的模块,这些模块只暴露对外开放的接口,模块间通过接口拼接,调用,组装成最终的系统。软件开发模型中的增量模型用到的就是组件思想。
组件的客户只关心组件的接口,不关心组件的内部实现和存放的路径。
对于组件自身而言,有以下问题需要考虑:
1.由于客户语言的多样性,客户语言的参数可能与自身实现语言的参数不一致,这个需要制定规范。
2.组件和客户的运行环境可能不一致,例如组件和用户不是运行在同一个进程里,客户如何将参数传给组件,组件如何将结果传回用户。
3.组件需要维护自身的生命周期,没有用户使用的时候应该销毁自己释放资源。
android系统中,应用开发经常会用AIDL实现进程间通讯,个人认为这个和组件思想一致,因此将它们放在一起对比。
COM有IDL文件用来定义接口,android应用开发可以用AIDL文件定义接口,目的就是制定参数类型规范。
COM可以用IPC,LPC,RPC等技术实现请求方法请求参数和响应结果的传递,AIDL中借助binder机制实现。实现原理都是按照规范将参数打包,解包过程。
为了扩展性和对用户透明,IDL和AIDL编译器会自动生成XXX.proxy和XXX.stub文件,整个组件用户从请求到接收到结果过程是这样的:
1.组件用户调用组件接口时,proxy自动代理组件用户的请求,并将请求方法和参数打包传给stub,组件用户不需要感知proxy的存在。
2.stub与proxy进行通讯,将proxy的请求解包,提取方法和参数传给组件并等待组件的返回结果。
3..stub将返回的结果打包传给proxy, proxy解包后,传给组件用户。至此, 一次完整的用户的组件的交互完成。
至于组件自身生命周期的管理, COM中使用引用计数算法, android中则由虚拟机的标记跟踪算法决定。
利用组件技术的优势:
1.升级方便,只需要换某一个组件。许多优秀的系统都采用组件技术,例如windows系统,还有Elastos系统 ( 呵呵,打个广告)。
2.适用敏捷开发模式。核心基础组件,业务逻辑组件,UI组件等可以相互独立,开发人员都可以发挥自己的特长。