讀《大話設計模式》---代理模式(proxy)

代理模式(proxy)

爲其他對象提供一個代理以控制對這個對象的訪問。

結構圖

  1. //Subject類,定義了RealSubjext和Proxy的公共接口,這樣就在任何使用RealSubject的地方可以使用Proxy
  2. class Subject
  3. {
  4. public:
  5.     virtual void Request() = 0;
  6. };
  7. //RealSubject類,定義Proxy所代表的真實實體
  8. class RealSubject: public Subject
  9. {
  10. public:
  11.     virtual void Request()
  12.     {
  13.         cout << "真實的請求" << endl;
  14.     }
  15. };
  16. //Proxy類,保存一個引用使得代理可以訪問實體
  17. class Proxy : public Subject
  18. {
  19. private:
  20.     RealSubject * realSubject;
  21. public:
  22.     virtual void Request()
  23.     {
  24.         if(realSubject == NULL)
  25.         {
  26.             realSubject = new RealSubject;
  27.         }
  28.         realSubject->Request();
  29.     }
  30. };
  31. int main(int argc, char* argv[])
  32. {
  33.     Proxy * proxy = new Proxy();
  34.     proxy->Request();
  35.     return 0;
  36. }

代理模式的應用:

 

  • 遠程代理,也就是爲一個對象在不同的地址空間提供局部代理。這樣可以隱藏一個對象存在於不同地址空間的事實

      WebServer在.net中的應用就是這樣的一個例子

  • 虛擬代理,是根據需要創建開銷很大的對象。通過它來存放實例化需要很長時間的真對象。

       這樣可以達到性能的最優化,比如說你打開一個很大的HTML網頁時,裏面可能有很多的文字和圖片,文字很快就出來了,但是圖片卻是一張一張下載後才能看到,那些未打開的圖片框,就是通過虛擬代理替換了真實的圖片。

  • 安全代理,用來控制真實對象訪問時的權限。
  • 智能指引,是指當調用真實的對象時,代理處理另外一些事。

 

下面舉個實例:

秀才讓小六代其求婚

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. // BeautifulGirl
  5. class BeautifulGirl
  6. {
  7. public:
  8.     string Name; 
  9. };
  10. //代理接口
  11. class PursueMM
  12. {
  13.     virtual void Giveflower() = 0;
  14.     virtual void InviteDinning() = 0;
  15.     virtual void Shopping() = 0;
  16. };
  17. //追求者類
  18. class Pursuit : public PursueMM
  19. {
  20. private:
  21.     string name;
  22.     BeautifulGirl * mm;
  23. public:
  24.     Pursuit(BeautifulGirl * _mm = NULL) : mm(_mm){}
  25.     void Giveflower()
  26.     {
  27.         cout << "送" << mm->Name + "鮮花" << endl;
  28.     }
  29.     void InviteDinning()
  30.     {
  31.         cout << "請" << mm->Name + "吃飯" << endl;
  32.     }
  33.     void Shopping()
  34.     {
  35.         cout << "帶" << mm->Name + "逛商場" << endl;
  36.     }
  37. };
  38. //代理類如下
  39. class Proxy : public PursueMM
  40. {
  41. private:
  42.     Pursuit * gg;
  43. public:
  44.     Proxy(BeautifulGirl * mm = NULL)
  45.     {
  46.         gg = new Pursuit(mm);
  47.     }
  48.     void Giveflower()
  49.     {
  50.         cout << "小六";
  51.         gg->Giveflower();
  52.     }
  53.     void InviteDinning()
  54.     {
  55.         cout << "小六";
  56.         gg->InviteDinning();
  57.     }
  58.     void Shopping()
  59.     {
  60.         cout << "小六";
  61.         gg->Shopping();
  62.     }
  63. };
  64. int main()
  65. {
  66.     BeautifulGirl * Guofurong = new BeautifulGirl;
  67.     Guofurong->Name = "郭芙蓉";
  68.     Proxy * xiaoliu = new Proxy(Guofurong);
  69.     xiaoliu->Giveflower();
  70.     xiaoliu->InviteDinning();
  71.     xiaoliu->Shopping();
  72.     return 0;
  73. }
發佈了107 篇原創文章 · 獲贊 12 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章