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接口的客戶。包裝類實際上就是組件的包容。