在
前面的文章中我们介绍了COM接口及其与COM组件的关系,在这一节中我将向大家介绍COM组件的可重用性。
包容与聚合
与所有面向对象的系统一样,COM组件的可重用性是其很重要的一个特性。与C++类在原代码级别的重用不同,COM组件的重用是建立在对二进制代码重用的基础上的。具体包括包容(containment)和聚合(aggregation)两种重用模型。这两种重用机制非常相似,其本质也都是在一个组件中对另外一个组件的使用。
在包容机制中,外部组件除了实现自己的接口外,还包含了指向内部组件所有接口的指针,使内部组件接口相对于外部组件的客户是不可见的,只有通过外部组件提供的接口才能间接完成对内部组件接口的调用,并以此实现对已有组件的重用。由于包容机制为内部组件接口提供了外部接口实现,因此可以通过在外部接口添加适当的代码以完成与被重用组件所提供服务类似的功能。这有些类似于对C++类虚函数的重载。
图6 包容与聚合重用模型
聚合机制的本质其实就是包容,只不过是其一个特例而已。采用聚合机制的组件并没有实现用于转发给内部组件接口的接口,而是直接将客户发出的对内部组件接口的请求直接传递给内部组件的接口,使其直接暴露于外部组件的客户。但是客户在请求到此接口指针并对其接口进行调用时,仍不会意识到被重用组件的存在。由于外部组件对内部组件的重用只是通过传递对接口的请求而将被请求接口暴露于客户,因此只能实现与被重用组件所提供服务完全一样的重用功能。与包容不同,并不是所有的组件都能够支持聚合。至于在重用时是采取包容机制还是聚合机制,关键在于要实现的功能与待重用的组件所提供服务是类似还是完全一致。
查看本文来源