zoukankan      html  css  js  c++  java
  • 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 }

    输出结果:

  • 相关阅读:
    Can't remove netstandard folder from output path (.net standard)
    website项目的reference问题
    The type exists in both DLLs
    git常用配置
    Map dependencies with code maps
    How to check HTML version of any website
    Bootstrap UI 编辑器
    网上职位要求对照
    Use of implicitly declared global variable
    ResolveUrl in external JavaScript file in asp.net project
  • 原文地址:https://www.cnblogs.com/SmallAndGreat/p/13473597.html
Copyright © 2011-2022 走看看