1.包容和聚合
包容和聚合实际上是使一个组件使用另一个组件的一种技术。
包容简介
外部组件包含指向内部组件接口的指针,外部组件只是内部组件的一个客户。外部组件也可以通过将调用转发给内部组件的方法重新实现内部组件所支持的某个接口,并且外部组件还可以在内部组件代码的前面加上一些代码以对接口进行改造。
聚合简介
聚合是包容的一个特例,当一个外部组件聚合了某个内部组件的一个接口,外部组件将直接把内部组件的接口指针返回给客户。客户可以直接与内部组件通信。
2.客户端的简化
可以通过封装解决接口查询的臃肿、AddRef、Release的调用问题。使用智能指针类来封装接口指针和通过包装类对接口进行封装。
智能接口指针
智能接口指针的使用同常规的C++指针的使用是相同的,他将引用计数这类细节隐藏起来,当程序的执行离开了智能接口指针的作用域之后,相应的接口将被释放掉。
智能指针实际上就是一个重载了-》的类。智能接口指针类保护指向另外一个对象的指针。当用户调用智能指针上的-》操作符时,智能指针把此调用转发给他所包含的指针所指的对象,智能接口指针中包含的指针将是一个指向一个接口的。
class CFoo
{
public:
virtual void Bar();
};
classCFooPointer
{
public:
CFooPointer(CFoo*p){m_p = p;}
CFoo*operator ->(){returnm_p;}
private:
CFoo*m_p;
};
voidFunky(CFoo *pFoo)
{
CFooPointerspFoo(pFoo);
spFoo->Bar();
}
Funky函数创建了一个名为spFoo的CFooPointer对象并用pFoo对其初始化。spFoo指针将把相应函数调用转发给m_p也就是pFoo。
CFooPointer作为一个智能指针是不够,实际上并没有做任何事情。
C++包装类
若希望封装某个接口或接口集,可以使用C++包装类。包装类是一个或多个COM接口的客户。包装类实际上就是组件的包容。