`

代理模式(Proxy)

 
阅读更多
代理模式:为另一个对象提供一个替身或占位符以控制这个对象的访问。
(为其它对象提供一种代理以控制对这个对象的访问)

要点:
1.远程代理管理客户和运程对象之间的交互
2.虚拟代理控制访问实例化开销大的对象
3.保护代理基于调用者控制对象方法的访问
4.代理模式有许多变体,例如:缓存代理,同步代理,防火墙代理和写入时复制代理
5.代理在结构上类似装饰者,但是目的不同
6.装饰者模式为对象加上了行为,而代理则是控制访问
7.和其它的包装者(wrapper)一样,代理会造成你设计中类的数目增加

应用场景:
1.远程代理:为一个对象在不同的地址空间提供局部代理.这样可以隐藏一个对象存在于不同地址空间的事实
2.虚拟代理:是根据需要创建开销很大的对象.通过它来存放实例化需要很长时间的真实对象
3.安全代理:用来控制真实对象访问的权限,用于对象有不同的访问权限的时候
4.智能指引:指当调用真实的对象时,代理处理另外一些事,如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它.它们都是通过代理在访问一个对象时附加一些内存处理(ps:智能指针的实现是用的代理模式?回头再看下boost的源码吧,有点忘了)


#include<iostream>
using namespace std;
class A{
private:
    int num;
public:
    A(int n):num(n){}
    int getNum()const{
        return num;
    }
};

class AProxy{
private:
    A* a;
public:
    AProxy(A* aa):a(aa){}
    int getNum()const{
        return a->getNum();
    }
};

int main(){
    AProxy *proxy = new AProxy(new A(10));
    cout << proxy->getNum() << endl;
}



强制代理:



#include <iostream>
using namespace std;

class DB{
public:
    DB(){}
    virtual ~DB(){}
    virtual int add()=0;
    virtual int del()=0;
};

class MySQLDB:public DB
{
public:
    int add()
    {
        cout << "mysql add" << endl;
        return 0;
    }
    int del()
    {
        cout << "mysql del" << endl;
        return 0;
    }
};

class OracleDB:public DB
{
public:
    int add()
    {
        cout << "oracle add" << endl;
        return 0;
    }
    int del()
    {
        cout << "oracle del" << endl;
        return 0;
    }
};

class DBProxy
{
public:
    static DBProxy* getInstance()
    {
        static DBProxy dbProxy;
        return &dbProxy;
    }
    void setDB(DB* db){
        mDB = db;
    }
    int add()
    {
        if(mDB==NULL)
        {
            cout << "无法add,请设置db" << endl;
            return -1;
        }
        return mDB->add();
    }
    int del()
    {
        if(mDB==NULL)
        {
            cout << "无法del,请设置db" << endl;
            return -1;
        }
        return mDB->del();
    }

private:
    DBProxy(){
        mDB = NULL;
    }
private:
    DB* mDB;
};

int main()
{
    DBProxy* dbProxy = DBProxy::getInstance();
    dbProxy->add();
    dbProxy->del();
    dbProxy->setDB(new MySQLDB);
    dbProxy->add();
    dbProxy->del();
    dbProxy->setDB(new OracleDB);
    dbProxy->add();
    dbProxy->del();
}


无法add,请设置db
无法del,请设置db
mysql add
mysql del
oracle add
oracle del
  • 大小: 15.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics