7 重用模型.pptVIP

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7 重用模型

七 COM重用模型 包容 聚合 1 包容 1.1 模型 重用性: 源代码级:C++ 继承. 二进制级:COM. 如何重用已有的COM对象的功能,而不是重新实现。COM规范规定了两种重用的方法:包容(Containment)和聚合(Aggregation) 包容: 假定我们已经实现了一个COM对象,不妨称为对象A,它实现了接口ISomeInterface,不久,我们需要实现一个新的COM对象,称为对象B,它既要实现对象A所支持的ISomeInterface,(两者的功能基本一致),也要实现其他的功能IOtherInterface。我们应该考虑在对象B中重用对象A的功能,而只需在对象B中添加上新的功能即可。 直观的设想:对象B在实现ISomeInterface时调用对象A的ISomeInterface的成员函数。对象A只是一个普通的COM对象,但是,它也可以给另一个COM对象B提供服务。对象B在为客户提供服务的同时,自己也是对象A的客户。对象B既是服务器,也是客户。这种重用方式就是包容。对象B包容对象A,对象A被对象B包容。 包容的示意图: 包容的示意图。嵌套的客户/服务器模型。 对象B在调用对象A的接口成员函数时可以完全自由地处理,以响应客户的请求。客户看到的只是对象B所暴露出来的接口。对象A的创建和释放完全在对象B的内部进行。 比较简单直观的做法:对象B在构造时,同时创建对象A,并保留对象A的接口指针,以便在对象B的接口成员函数中使用。当对象B被释放时,首先释放对象A。 更高效率的做法:对象B在需要的时候才创建,并在使用完后及时销毁。 1 .2 包容的实现 假定内部A对象实现了接口ISomeInterface 外部对象B实现了IOtherInterface接口。接口的定义如下: class ISomeInterface:public IUnkown { public: virtual HRESULT _stdcall SomeFunction()=0; } class IOtherInterface:public IUnkown { public: virtual HRESULT _stdcall OtherFunction()=0; } 客户程序、内部对象A、外部对象B三者之中,客户并不知道B包容了A,它仍然和以前一样的方法来调用B,而A也不知道自己被B包容,仍然和以前一样为所有的客户提供服务。而B则要处理对象A的创建、调用、释放工作。 对象B的定义如下: class CB : public ISomeInterface , public IOtherInterface { public : CB(); ~CB(); public : HRESULT __stdcall QueryInterface(const IID iid, void **ppv) ; ULONG __stdcall AddRef() ; ULONG __stdcall Release() ; HRESULT __stdcall SomeFunction(); // ISomeInterface 的成员函数 HRESULT __stdcall OtherFunction(); // IOtherInterface的成员函数 HRESULT __stdcall Init(); //包容过程的初始化函数 private: ISomeInterface * m_pSomeInterface; //B对象包含一个指向 ISomeInterface接口的指针。 ......} 其中:CB::~CB() { if(m_pSomeInterface!=NULL) m_pSomeInterface-Release(); //当对象B被析构时通过调用对象A的Release成员释放对象A。 ......} 内部对象是在外部对象的Init函数中创建的: HRESULT CB::Init() { HRESULT result= ::CoCreateInstance(CLSID_ComponentA,NULL,CLSCTX_INPROC_SERVER, IID_ISomeInterface,(void**)m_pSomeInterface); if (FAILED(result)) return E_FAIL; else return S_OK; } //在Init成员函数中,对象B创建了对象A,如果成功,数据成员m_pSomeInterface记录了对象A的ISomeInterface接口

文档评论(0)

1234554321 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档