004 --- 第7章 代理模式

简述:

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

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

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

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

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

 

应用场景:代理类和被代理类继承自同一基类,代理类内部创建被代理类的对象,执行被代理类的逻辑,控制被代理类的访问

 

注:开发环境调整为VS2017,操作系统win11

代理模式代码:

 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 }

 输出结果:

 

posted @ 2020-08-11 09:16  二是一种不三不亖的范  阅读(122)  评论(0编辑  收藏  举报