代理模式(proxy)
爲其他對象提供一個代理以控制對這個對象的訪問。
結構圖
- //Subject類,定義了RealSubjext和Proxy的公共接口,這樣就在任何使用RealSubject的地方可以使用Proxy
- class Subject
- {
- public:
- virtual void Request() = 0;
- };
- //RealSubject類,定義Proxy所代表的真實實體
- class RealSubject: public Subject
- {
- public:
- virtual void Request()
- {
- cout << "真實的請求" << endl;
- }
- };
- //Proxy類,保存一個引用使得代理可以訪問實體
- class Proxy : public Subject
- {
- private:
- RealSubject * realSubject;
- public:
- virtual void Request()
- {
- if(realSubject == NULL)
- {
- realSubject = new RealSubject;
- }
- realSubject->Request();
- }
- };
- int main(int argc, char* argv[])
- {
- Proxy * proxy = new Proxy();
- proxy->Request();
- return 0;
- }
代理模式的應用:
- 遠程代理,也就是爲一個對象在不同的地址空間提供局部代理。這樣可以隱藏一個對象存在於不同地址空間的事實
WebServer在.net中的應用就是這樣的一個例子
-
虛擬代理,是根據需要創建開銷很大的對象。通過它來存放實例化需要很長時間的真對象。
這樣可以達到性能的最優化,比如說你打開一個很大的HTML網頁時,裏面可能有很多的文字和圖片,文字很快就出來了,但是圖片卻是一張一張下載後才能看到,那些未打開的圖片框,就是通過虛擬代理替換了真實的圖片。
-
安全代理,用來控制真實對象訪問時的權限。
-
智能指引,是指當調用真實的對象時,代理處理另外一些事。
下面舉個實例:
秀才讓小六代其求婚
- #include <iostream>
- #include <string>
- using namespace std;
- // BeautifulGirl類
- class BeautifulGirl
- {
- public:
- string Name;
- };
- //代理接口
- class PursueMM
- {
- virtual void Giveflower() = 0;
- virtual void InviteDinning() = 0;
- virtual void Shopping() = 0;
- };
- //追求者類
- class Pursuit : public PursueMM
- {
- private:
- string name;
- BeautifulGirl * mm;
- public:
- Pursuit(BeautifulGirl * _mm = NULL) : mm(_mm){}
- void Giveflower()
- {
- cout << "送" << mm->Name + "鮮花" << endl;
- }
- void InviteDinning()
- {
- cout << "請" << mm->Name + "吃飯" << endl;
- }
- void Shopping()
- {
- cout << "帶" << mm->Name + "逛商場" << endl;
- }
- };
- //代理類如下
- class Proxy : public PursueMM
- {
- private:
- Pursuit * gg;
- public:
- Proxy(BeautifulGirl * mm = NULL)
- {
- gg = new Pursuit(mm);
- }
- void Giveflower()
- {
- cout << "小六";
- gg->Giveflower();
- }
- void InviteDinning()
- {
- cout << "小六";
- gg->InviteDinning();
- }
- void Shopping()
- {
- cout << "小六";
- gg->Shopping();
- }
- };
- int main()
- {
- BeautifulGirl * Guofurong = new BeautifulGirl;
- Guofurong->Name = "郭芙蓉";
- Proxy * xiaoliu = new Proxy(Guofurong);
- xiaoliu->Giveflower();
- xiaoliu->InviteDinning();
- xiaoliu->Shopping();
- return 0;
- }