代理模式:为另一个对象提供一个替身或占位符以控制这个对象的访问。
(为其它对象提供一种代理以控制对这个对象的访问)
要点:
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