现在的位置: 首页 > 综合 > 正文

读《大话设计模式》---代理模式(proxy)

2013年06月19日 ⁄ 综合 ⁄ 共 2190字 ⁄ 字号 评论关闭

代理模式(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. }

抱歉!评论已关闭.