• 004 --- 第7章 代理模式


    简述:

      代理模式为其他对象提供一种代理以控制这个对象的访问。

      代理模式包括:虚基类、被代理类、代理类。

        虚基类:定义了被代理类和代理类的公共接口,这样就在任何使用被代理类的地方都可以使用代理类。

        被代理类:继承自虚基类,定义代理类所代表的实体

        代理类:继承自虚基类,保存一个被代理类对象,使得代理类可以访问被代理类实体,并提供一个与被代理类的接口相同的接口,这样代理类就可以用来替代被代理类实体。

    代理模式代码:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 // 虚基类
     5 class CSubject
     6 {
     7 public:
     8     virtual void Request() = 0;
     9 };
    10 
    11 // 被代理类
    12 class CRealSubject : public CSubject
    13 {
    14 public:
    15     virtual void Request()
    16     {
    17         cout << "真实的请求" << endl;
    18     }
    19 };
    20 
    21 // 代理类
    22 class CProxy : public CSubject
    23 {
    24 private:
    25     CRealSubject m_RealSubject;
    26 
    27 public:
    28     virtual void Request()
    29     {
    30         m_RealSubject.Request();
    31     }
    32 };
    33 
    34 int main()
    35 {
    36     CProxy proxy;
    37     proxy.Request();
    38 
    39     system("pause");
    40     return 0;
    41 }

    运行结果:

    例:替别人追女孩纸

    代码如下:

      1 #include <iostream>
      2 #include <string>
      3 using namespace std;
      4 
      5 // 被追求者类
      6 class CSchoolGirl
      7 {
      8 private:
      9     string m_szName;
     10 
     11 public:
     12     void SetName(string szName)
     13     {
     14         m_szName = szName;
     15     }
     16 
     17     string GetName()
     18     {
     19         return m_szName;
     20     }
     21 };
     22 
     23 // 送礼物接口类(虚基类)
     24 class CGiveGift
     25 {
     26 public:
     27     virtual void GiveDolls() = 0;
     28     virtual void GiveFlowers() = 0;
     29     virtual void GiveChocolate() = 0;
     30 };
     31 
     32 // 追求者类(被代理类)
     33 class CPursuit : public CGiveGift
     34 {
     35 private:
     36     CSchoolGirl* m_pSchoolGirl;
     37 
     38 public:
     39     CPursuit(CSchoolGirl* pSchoolGirl)
     40     {
     41         m_pSchoolGirl = pSchoolGirl;
     42     }
     43 
     44     virtual void GiveDolls()
     45     {
     46         cout << m_pSchoolGirl->GetName() << " 送你洋娃娃" << endl;
     47     }
     48 
     49     virtual void GiveFlowers()
     50     {
     51         cout << m_pSchoolGirl->GetName() << " 送你鲜花" << endl;
     52     }
     53 
     54     virtual void GiveChocolate()
     55     {
     56         cout << m_pSchoolGirl->GetName() << " 送你巧克力" << endl;
     57     }
     58 };
     59 
     60 // 代理类
     61 class CProxy : public CGiveGift
     62 {
     63 private:
     64     CPursuit* m_pPursut;
     65 
     66 public:
     67     CProxy(CSchoolGirl* pSchoolGirl)
     68     {
     69         m_pPursut = new CPursuit(pSchoolGirl);
     70     }
     71 
     72     ~CProxy()
     73     {
     74         if (m_pPursut)
     75         {
     76             delete m_pPursut;
     77             m_pPursut = NULL;
     78         }
     79     }
     80 
     81     virtual void GiveDolls()
     82     {
     83         m_pPursut->GiveDolls();
     84     }
     85 
     86     virtual void GiveFlowers()
     87     {
     88         m_pPursut->GiveFlowers();
     89     }
     90 
     91     virtual void GiveChocolate()
     92     {
     93         m_pPursut->GiveChocolate();
     94     }
     95 };
     96 
     97 int main()
     98 {
     99     CSchoolGirl SchoolGirl;
    100     SchoolGirl.SetName("李娇娇");
    101 
    102     CProxy Proxy(&SchoolGirl);
    103     Proxy.GiveDolls();
    104     Proxy.GiveFlowers();
    105     Proxy.GiveChocolate();
    106 
    107     system("pause");
    108     return 0;
    109 }

    输出结果:

  • 相关阅读:
    MySQL之字符集
    PHP7.0-PHP7.3新特性与变更
    MySQL之开发规范
    php框架之thinkphp
    MySQL之日期时间类型
    php扩展之Yar
    XAMPP支持多PHP版本
    MySQL之执行流程
    RabbitMQ之php-amqplib使用
    (转)YAML最最基础语法
  • 原文地址:https://www.cnblogs.com/SmallAndGreat/p/13473597.html
Copyright © 2020-2023  润新知