一. 舉例說明
我們有時打開一個網站時會發現有這樣的現象,網站上的文字都顯示出來了,但是上面的圖片還沒顯示,要等一會才能顯示。
這些未打開的圖片的位置上,還是會有圖片框和一些等待的信息的,這就是代理模式的應用,此時的代理存儲了真實圖片的路徑和尺寸也用來顯示一些友好的信息。
結構圖如下:
代碼實現:
[cpp] view plaincopyprint?//基類
class BigImage
{
public:
BigImage(string name): m_imageName(name) {}
virtual ~BigImage() {}
virtual void Show() {}
protected:
string m_imageName;
};
//真實類
class RealBigImage: public BigImage
{
public:
RealBigImage(string name):BigImage(name) {}
~RealBigImage() {}
void Show()
{
cout<<"Show big image : "<<m_imageName<<endl;
}
};
//代理
class Proxy: public BigImage
{
private:
RealBigImage *m_bigImage;
public:
Proxy(string name):BigImage(name),m_bigImage(0)
{}
~Proxy()
{
delete m_bigImage;
}
void Show()
{
if(m_bigImage == NULL)
{
cout<<"please wait ..."<<endl;
m_bigImage = new RealBigImage(m_imageName); //代理創建真實對象
}
m_bigImage->Show();
}
};
int main()
{
BigImage *image = new Proxy("SomeBigPic.jpg"); //使用代理
image->Show(); //代理的操作
delete image;
return 0;
}
//基類
class BigImage
{
public:
BigImage(string name): m_imageName(name) {}
virtual ~BigImage() {}
virtual void Show() {}
protected:
string m_imageName;
};
//真實類
class RealBigImage: public BigImage
{
public:
RealBigImage(string name):BigImage(name) {}
~RealBigImage() {}
void Show()
{
cout<<"Show big image : "<<m_imageName<<endl;
}
};
//代理
class Proxy: public BigImage
{
private:
RealBigImage *m_bigImage;
public:
Proxy(string name):BigImage(name),m_bigImage(0)
{}
~Proxy()
{
delete m_bigImage;
}
void Show()
{
if(m_bigImage == NULL)
{
cout<<"please wait ..."<<endl;
m_bigImage = new RealBigImage(m_imageName); //代理創建真實對象
}
m_bigImage->Show();
}
};
int main()
{
BigImage *image = new Proxy("SomeBigPic.jpg"); //使用代理
image->Show(); //代理的操作
delete image;
return 0;
}
說明:
BigImage:虛基類,定義了 RealBigImage 和 Proxy 的共用接口,這樣就在任何使用 RealBigImage 的地方都可以使用 Proxy。
RealBigImage:定義Proxy所代表的真實實體。
Proxy:通過代理訪問實體。
二. 代理模式
定義:為其他對象提供一種代理以控制對這個對象的訪問。
代理模式分為四種情況:(1)遠程代理,(2)虛代理,(3)保護代理,(4)智能引用。
上文介紹的是虛代理,虛代理是當創建開銷很大時,通過代理來存放需要很長時間的真實對象。
代理模式的要點:
1. 代理模式與真實對象有同樣的接口,這樣保證在任何使用 RealSubject 的地方都可以使用 Proxy。
2. Proxy 保存一個真實象的引用,這樣可以訪問 RealSubject 對象。
作者 lwbeyond