return *this;
}
T* Get()
{
T* ptr = NULL;
ptr = m_pData;
return ptr;
}
void Attach(T* pObject)
{
if (m_pReference->Release() == 0)
{
SAFE_DELETE(m_pData);
SAFE_DELETE(m_pReference);
}
m_pData = pObject;
m_pReference = new KRefCount;
m_pReference->AddRef();
}
T* Detach()
{
T* ptr = NULL;
if (m_pData)
{
ptr = m_pData;
m_pData = NULL;
m_pReference->Reset();
}
return ptr;
}
private:
KRefCount* m_pReference;
T* m_pData;
};
class CTest
{
public:
CTest(int b) : a(b) {}
private:
int a;
};
int main()
{
SmartPtr<CTest> pSmartPtr1(new CTest(10));
SmartPtr<CTest> pSmartPtr2(new CTest(20));
pSmartPtr1 = pSmartPtr2;
}
智能指针使用引用计数实现时,就是最好的使用代理模式的例子。在上面的例子中,SmartPtr就是一个代理类,而T* m_pData才是实际的数据。SmartPtr代理实际的数据,去实现了指针的行为,添加了引用计数,从而实现了智能指针。
总结
我在第一次接触代理模式的时候,看它的UML类图,发现它和适配器模式的类适配器很像,再一看,又和装饰模式非常像;不仔细区分,真的是很容易混乱的。下面就做简单的区分,说多了也都是“狡辩”了。










