我的这篇博客的思想均来自于博客:那谁的技术博客,wang_gary。非常感谢他们带我进入代理模式。
按照设计模式中介绍思路:
意图:为其他对象提供一种代理以控制这个对象的访问。
适用性:
1、远程代理(remote proxy),为一个对象在不同的地址空间提供局部代理,
2、虚代理(virtual proxy), 根据需要创建开销很大的对象
3、保护代理(protection proxy),控制对原始对象的访问,保护代理用于对象应该有不同的访问权限的时候。
4、智能指针(smart reference),取代了简单的指针,它在访问对象时执行一些附加操作,包括(1、对指向实际对象的引用计数,当该对象没有引用时,可以自动释放它;2、当第一次引用一个持久对象时,将它装入内存;3、在访问一个实际对象前,检查是否已经锁定了他,以确保其他对象不能改变它)
参与者:
proxy:提供一个与subject的接口相同的接口,这样代理就可以代替实体
subject:定义realsubject与proxy的共用接口,这样在任何使用realsubject的地方都可以使用proxy代替
realsubject:定义proxy所代表的实体
接下来我们使用程序简单展示一下:
proxy.h
//设计模式之代理模式proxy
//例子代码来自http://www.cppblog.com/converse/
//作者:李创
/*
作用:为其他对象提供一种代理用以控制这个对象的访问
先上手一个最简单的例子
*/
//定义一个抽象基类subject,并定义共有接口
//这样就可以在任何需要使用realsubject的时候都使用proxy了
class subject
{
public:
subject(){}
virtual ~subject(){}
public:
virtual void Request() = 0;
};
//定义真正的实体
class realsubject :public subject
{
public:
realsubject();
virtual ~realsubject();
public:
virtual void Request();
};
//定义代理类,含有一个指向realsubject的对象的指针
class proxy :public subject
{
public:
proxy();
virtual ~proxy();
public:
virtual void Request();
private:
realsubject* pRealsubject;
};
proxy.cpp
#include <iostream>
#include "proxy.h"
using namespace std;
realsubject::realsubject()
{
cout<<"constructing a realsubject"<<endl;
}
realsubject::~realsubject()
{
cout<<"distory the realsubject"<<endl;
}
void realsubject::Request()
{
cout<<"request by realsubject"<<endl;
}
proxy::proxy()
{
pRealsubject = NULL;
cout<<"constructing a proxy"<<endl;
}
proxy::~proxy()
{
delete pRealsubject;
pRealsubject = NULL;
cout<<"distory the proxy"<<endl;
}
void proxy::Request()
{
//需要使用realsubject的时候去初始化一下
if(NULL == pRealsubject)
{
cout<<"request by proxy"<<endl;
pRealsubject = new realsubject();
}
pRealsubject->Request();
}
实际使用的时候,我们可以这样:
subject *pProxy = new proxy();
pProxy->Request();
delete pProxy;
pProxy = NULL;
通过这个小例子,代理模式的用法可以说很清晰了,那接下来我们上一个非常形象的例子:
proxy.h
/*
大家都看过水浒,接下来的例子就是根据水浒西门庆与潘金莲的故事而作
*/
//首先抽象出一个风骚女人的基类
class loosewomen
{
public:
loosewomen(){};
virtual ~loosewomen(){};
public:
//风骚女人会向男人抛媚眼
virtual void makeeyeswithman() = 0;
//风骚女人跟男人XX
virtual void makelovewithman() = 0;
};
//声明一个代理类(媒婆),所有的操作都可以通过媒婆来安排
class wangpo:public loosewomen
{
public:
wangpo(loosewomen *pwomen);
~wangpo();
public:
void makeeyeswithman();
void makelovewithman();
private:
loosewomen *ploosewomen;
};
//实例化一个风骚女,潘金莲
class panjinlian:public loosewomen
{
public:
panjinlian();
~panjinlian();
public:
void makeeyeswithman();
void makelovewithman();
};
//实例化一个风骚女,小凤仙
class xiaofengxian:public loosewomen
{
public:
xiaofengxian();
~xiaofengxian();
public:
void makeeyeswithman();
void makelovewithman();
};
proxy.cpp
wangpo::wangpo(loosewomen *pwomen)
{
ploosewomen = pwomen;
}
wangpo::~wangpo()
{
delete ploosewomen;
}
void wangpo::makeeyeswithman()
{
ploosewomen->makeeyeswithman();
}
void wangpo::makelovewithman()
{
ploosewomen->makelovewithman();
}
panjinlian::panjinlian()
{
cout<<" panjinlian born "<<endl;
}
panjinlian::~panjinlian()
{
cout<<"panjinlian death"<<endl;
}
void panjinlian::makeeyeswithman()
{
cout<<"panjinlian make eyes"<<endl;
}
void panjinlian::makelovewithman()
{
cout<<"panjinlian make love"<<endl;
}
xiaofengxian::xiaofengxian()
{
cout<<"xiaofengxian born"<<endl;
}
xiaofengxian::~xiaofengxian()
{
cout<<"xiaofengxian death"<<endl;
}
void xiaofengxian::makeeyeswithman()
{
cout<<"xiaofengxian make eyes"<<endl;
}
void xiaofengxian::makelovewithman()
{
cout<<"xiaofengxian make love"<<endl;
}
使用时可以这样:
wangpo *pwangpo;
pwangpo = new wangpo(new panjinlian());
pwangpo->makeeyeswithman();
pwangpo->makelovewithman();
delete pwangpo;
pwangpo = new wangpo(new xiaofengxian());
pwangpo->makeeyeswithman();
pwangpo->makelovewithman();
delete pwangpo;
这里的程序非常简单易懂,就不一一解析了。