C++设计模式——代理(Proxy)模式

C++设计模式——代理(Proxy)模式

  • 代理模式定义

Proxy模式根据使用场景可以分为下面几类:

  1. 智能指针:智能指针主要通过代理一个对象的时候,会记录引用的次数,当次数为0时释放对象

  2. 保护代理:在对一个对象访问的时候,添加对不同权限的处理逻辑,这个也是交给代理做的

  3. 远程代理:为网络上的对象创建一个局部对象,所有网络通讯操作交给代理去做,让客户可以会忽略这些被代理的对象是不是远程的

  4. 虚拟代理:创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成

  • 代理模式结构

C++设计模式——代理(Proxy)模式_第1张图片

代理模式的角色:

  1. Subject:代理者与被代理者共同实现的接口,即需要代理的行为;

  2. ConcreteSubject:被代理者,具有某种特定行为的实现者;

  3. Proxy:代理者,其会全权代理ConcreteSubject所具有的功能,同时可以做一些额外的工作;

  4. Client:客户端

  • 代码举例

举个代理模式实现智能指针的例子:

#include 
using namespace std;

class RefCount    //用于管理对象指针的次数的类
{
    public:
        RefCount():Count(0){}
 
    public:
        void Add(){Count++;}
        int Release(){Count--;return Count;}
        void Reset(){Count=0;}
 
private:
    int Count;
};
 
template 
class SmartPtr
{
public:
    SmartPtr(T* pData) {           //SmartPtr s1(new A(2));
        this->pData = pData;
        pRef = new RefCount();     //创建一个管理指针的count对象
        pRef->Add();            //count对象次数加一
    }

    SmartPtr(const SmartPtr& sp) {    //SmartPtr s2(s1);  以智能指针为入参构造
        pData = sp.pData;
        pRef = sp.pRef;
        pRef->Add();
    }

    ~SmartPtr(void)  {
        cout<<" ~SmartPtr"<Release() == 0) { //count对象存在且代理的数量为0
            if (pData) {	
                delete 	pData;
                pData = NULL;
            }
            if (pRef) {	
                delete 	pRef;
                pRef = NULL;
            }
        }
    } 

    T* operator->() {
        return pData;
    }
 
    T* Get() {                         //get方法返回指针对象
        T* ptr = NULL;        
        ptr = pData;
        return ptr;
    }
 
private:
    RefCount* pRef;
    T* pData;
};   //还有很多其它对象没有实现

class A {
    public:    
        int i;    
        A(int n):i(n) { };
        void show() {
            cout<<"i m class A"<
void test(SmartPtr& sp) {
    SmartPtr s3(sp);
    s3->show();
}

int main() {
    SmartPtr s1(new A(2));   //A对象指针托管给s1
    s1->show();
    SmartPtr s2(s1);
    s2->show();
    test(s2);
    cout<<"before destructed"<

这个例子的智能指针只是简单功能,实际还有很多运算符重载函数。

你可能感兴趣的:(设计模式,设计模式,代理模式)