COM特性 包容和聚合

包容:假定我們已經實現了一個COM對象,不妨稱它爲對象A,它實現了接口ISomeIntf,之後,考慮到新的需要,我們要實現一個新的COM對象,稱它爲B,它既要實現接口ISomeIntf,也要實現接口IOtherIntf,而且,ISomeIntf接口所提供的服務與對象A所提供的服務基本一致,於是,我們考慮在實現對象B的過程中重用對象A的功能,只需要實現新添加的功能就可以完成對象B的開發工作。最簡單的想法就是在實現對象B的接口ISomeIntf時調用對象A的相應成員函數,對於對象A來說,它只是當作一個普通的COM對象,而對於對象B來說,雖然它本身是一個COM對象,但它同時也是對象A的客戶,因爲它調用對象A的功能服務。對象B不再重複實現對象A已經實現的功能,而是調用對象A的服務來提供對外的功能服務,對於對象B的客戶來說,它根本不知道對象A的存在,可以說它是最大的受益者,因爲它得到了全面的功能服務。這樣的情形,我們稱爲對象B包容對象A,或者對象A被對象B包容;(包容實際上就是在一個組件對象實現過程中調用另一個組件對象的接口成員函數。)
 
聚合:假定要實現一個對象B,它支持兩個接口:ISomeInterface和IOtherInterface,同時發現對象所提供的ISomeInterface接口功能在另一個對象A中已經實現,而且不需要修改就可以滿足對象B的要求。這時對象B本身並不實現接口ISomeInterface,它只實現IOtherInterface接口;當對象B的客戶請求接口ISomeInterface時,對象B把對象A的ISomeInterface接口指針暴露給客戶程序,因此,客戶程序調用ISomeInterface時直接與對象A進行交互,但客戶並沒有感覺到在與對象A進行交互,它仍覺得自己在與對象B進行交互。


對象B調用對象A的相應成員函數實現ISomeInterface接口。因此,對象B的ISomeInterface接口提供的功能可以超過對象A的接口功能,返回結果也可以不一致。甚至,對象B的接口與對象A的接口不一定相同。一般來說,對象A的生存期包含在對象B的生存期之內。


在聚合模型中,被聚合的對象A雖然直接向對象B的客戶程序提供功能服務,但它的生存期仍受對象B控制,而且其他的一些行爲也受對象B的控制,包括內部狀態初始化、獲取數據等等。


爲了使聚合能夠順利實現,對象A必須能夠適應在被聚合的情況下進行特殊的處理,尤其是接口的QueryInterface成員函數,在被聚合情況下,當客戶請求它所不支持的接口或者IUknown接口時,它必須把控制交給外部對象,由外部對象決定客戶程序的請求結果。


聚合涉及到聚合對象和被聚合對象雙方的協作,並不是每個對象都能夠支持聚合特性,但聚合體現了組件軟件真正意義上的重用。而包容的重用性完全建立在客戶/服務器模型相對性的基礎上,實際上也就是客戶程序和組件程序的嵌套關係。這是包容和聚合本質的不同。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章