zoukankan      html  css  js  c++  java
  • 4 代理模式

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

    代理模式:

    ⒈远程代理  也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实(例如WEBSERVICES)

    ⒉虚拟代理  是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象(例如网页中的图片,通过虚拟代理来替代真实的图片,此时代理存储真实图片的路径和尺寸)

    ⒊安全代理  用来控制真实对象访问时的权限

    ⒋智能指引  指当调用真实对象时,代理处理另外一些事

    代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。

    代理模式

    代理模式的代码实现
    1 #include <iostream>
    2 #include <string>
    3
    4  using std::cout;
    5  using std::endl;
    6
    7  //用于定义实体类和代理类的公用接口
    8  class Subject
    9 {
    10  public:
    11 virtual void Request() = 0;
    12 };
    13
    14  //实体类
    15 class RealSubject : public Subject
    16 {
    17 public:
    18 void Request()
    19 {
    20 cout<<"实体类的要求操作"<<endl;
    21 }
    22 };
    23
    24 //代理类,保存了一个实体的引用
    25 class Proxy : public Subject
    26 {
    27 public:
    28 Proxy()
    29 {
    30 realSubject = new RealSubject();
    31 }
    32 void Request()
    33 {
    34 realSubject->Request(); //调用实体类的对应方法
    35 }
    36 private:
    37 RealSubject* realSubject;
    38 };
    39
    40 int main()
    41 {
    42 //客户端代码
    43 Proxy* proxy = new Proxy();
    44 proxy->Request();
    45
    46 return 0;
    47 }
    送礼物给MM的代理实现
    1 #include <iostream>
    2 #include <string>
    3
    4 using std::string;
    5 using std::cout;
    6 using std::endl;
    7
    8 class SchoolGirl
    9 {
    10 public:
    11 SchoolGirl()
    12 {
    13 }
    14 SchoolGirl(string name)
    15 {
    16 this->name = name;
    17 }
    18 string GetName()
    19 {
    20 return name;
    21 }
    22 private:
    23 string name;
    24 };
    25
    26 //代理接口类
    27 class GiveGift
    28 {
    29 public:
    30 virtual void GiveDolls() = 0;
    31 virtual void GiveFlowers() = 0;
    32 virtual void GiveChocolates() = 0;
    33 };
    34
    35 //追求者类
    36 class Pursuit : public GiveGift
    37 {
    38 public:
    39 Pursuit(SchoolGirl mm)
    40 {
    41 this->mm = mm;
    42 }
    43 void GiveDolls()
    44 {
    45 cout<<mm.GetName()<<" 送你洋娃娃"<<endl;
    46 }
    47 void GiveFlowers()
    48 {
    49 cout<<mm.GetName()<<" 送你鲜花"<<endl;
    50 }
    51 void GiveChocolates()
    52 {
    53 cout<<mm.GetName()<<" 送你巧克力"<<endl;
    54 }
    55 private:
    56 SchoolGirl mm;
    57 };
    58
    59 //代理类
    60 class Proxy : public GiveGift
    61 {
    62 public:
    63 Proxy(SchoolGirl mm)
    64 {
    65 gg = new Pursuit(mm);
    66 }
    67 void GiveDolls()
    68 {
    69 gg->GiveDolls();//在实现方法中调用“追求者”类的相关方法
    70 }
    71 void GiveFlowers()
    72 {
    73 gg->GiveFlowers();
    74 }
    75 void GiveChocolates()
    76 {
    77 gg->GiveChocolates();
    78 }
    79 private:
    80 Pursuit* gg;
    81 };
    82
    83 int main()
    84 {
    85 //客户端代码
    86 SchoolGirl jiaojiao("娇娇");
    87
    88 Proxy* daili = new Proxy(jiaojiao);
    89
    90 daili->GiveDolls();
    91 daili->GiveFlowers();
    92 daili->GiveChocolates();
    93
    94 ///娇娇不认识追求她的人,但却可以通过代理人得到礼物
    95
    96 return 0;
    97 }
  • 相关阅读:
    初识线段树
    win7下vc6.0打开文件未响应的解决方法
    SQL 2008安装
    20200730 Div.2模拟赛题解
    20190928 Div3模拟赛题解
    Codeforces Round #664 (Div. 2) 题解
    CSP2019回忆录
    [SHOI2014]三叉神经树(加强版)题解
    Linux 下修改Swap区设置
    LoadRunner监控Linux与Windows方法
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/1721165.html
Copyright © 2011-2022 走看看