C++ 设计模式 —— 12.代理模式
2019-12-13 本文已影响0人
JeremyYv
-
代理模式:一种结构型设计模式
-
应用场景:
代理模式,工作中很常用。我们在公司使用网络服务时,都会经过代理服务器,这个服务器会限制访问,统计流量,这便是代理模式的作用。
代理模式可以对访问进行一些额外的操作。
在C++11中的智能指针shared_ptr便是代理模式的典型应用,对指针提供代理的同时增加了引用计数,用于保证内存的释放。 -
实现方式:
创建代理类,将需要被代理的对象作为成员变量,并在构造时赋初值,需要增加的代理服务作为其他成员变量。
重载被代理对象的操作符,在对被代理对象进行操作时,进行记录或其他需求。
本文就使用引用计数指针作为举例
以下是代理模式的简单代码实现
#include <iostream>
using namespace std;
class Proxy_Ptr
{
public:
//构造,代理指针并开始计数
Proxy_Ptr(int* p):m_pData(p), m_pCnt(NULL)
{
m_pCnt = new int(1);
}
//拷贝构造,引用计数+1
Proxy_Ptr(Proxy_Ptr& rhs):m_pData(rhs.m_pData),m_pCnt(rhs.m_pCnt)
{
++(*m_pCnt);
}
//赋值,原引用计数-1,新引用计数+1
Proxy_Ptr& operator=(Proxy_Ptr& rhs)
{
if(m_pData == rhs.m_pData)
{
return *this;
}
if (NULL != m_pCnt)
{
--(*m_pCnt);
if(0 == *m_pCnt)
{
cout << "delete " << *m_pData << endl;
delete m_pData;
m_pData = NULL;
}
m_pData = rhs.m_pData;
m_pCnt = rhs.m_pCnt;
++(*m_pCnt);
}
return *this;
}
//析构,引用计数-1,计数为0时释放内存
~Proxy_Ptr()
{
--(*m_pCnt);
if(0 == *m_pCnt)
{
cout << "delete " << *m_pData << endl;
delete m_pData;
m_pData = NULL;
}
}
int operator*()
{
return *m_pData;
}
void Show()
{
cout << "Data: " << *m_pData << " Count: " << *m_pCnt << endl;
}
private:
int* m_pData;//被代理的对象
int* m_pCnt;//引用计数
};
主函数中的使用
int main()
{
Proxy_Ptr p(new int(6));
Proxy_Ptr p2(new int(10));
p = p2;
cout << "-----no pointer to 6-----" << endl;
cout << "p->m_pData:" << *p << endl;
p2.Show();
cout << "-----begin destruction-----" << endl;
return 0;
}
控制台输出结果
delete 6
-----no pointer to 6-----
p->m_pData:10
Data: 10 Count: 2
-----begin destruction-----
delete 10
如有错误,欢迎指正