聚合实现的示意图

以前学《COM技术内幕》的时候,对聚合的一个总结:


代码如下:

外部组件创建后,接着创建内部组件

IUnknown* pUnknownOuter = this; // this的值为&CA

CoCreateInstance(CLSID_CB,

pUnknownOuter,

CLSCTX_INPROC_SERVER,

IID_IUnknown,

(void**)&m_pUnknownInner);

m_pUnknownInner为外部组件的成员

调用下面的函数

{

IClassFactory* pIFactory = NULL;

CoGetClassObject(CLSID_IB,

NULL,

IID_IClassFactory,

(void**)&pIFactory);

pIFactory->CreateInstace(pUnknownOuter,iid,ppv);

}

CreateInstace(IUnknown* pUnknownOuter,const IID& iid,void** ppv)

{

//只能被IID_IUnknown接口聚合

if ((pUnknownOuter != NULL) && (iid != IID_IUnknown))

{

return CLASS_E_NOAGGREGATION ;

}

CB* pB = new(pUnknownOuter);

pB->NonQueryInterface(iid,ppv);

}

CB::NonQueryInterfacer(IID& iid,void** ppv)

{

if (iid = IID_IUnknown)

*ppv = static_cast<INonUnknown*>(this);

}

实际上CB的构造函数是这样的:

CB::CB(IUnknown* pUnknownOuter) : m_cRef(1)

{

::InterlockedIncrement(&g_cComponents) ;

if (pUnknownOuter == NULL) //不使用聚合,转换成非委托接口

{

m_pUnknownOuter = reinterpret_cast<IUnknown*>

(static_cast<INondelegatingUnknown*>

(this)) ;

}

else

{ //使用聚合 转换成外部接口

m_pUnknownOuter = pUnknownOuter ;

}

}

相关文章

适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题...
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结...
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容...