• 代理模式(6)


    今天,我们来讲一下代理模式

    一、举例:

    大家都追过女孩子,作为比较腼腆,不爱说话的程序员,想要送给心仪的女孩子礼物,但又不好意思,所以,会让自己比较外向豪放的好朋友去办这件事。自己买了礼物,然后让好朋友帮忙送给女孩子。

    二、演绎

    1、第一步演绎

    下面,我们用一个控制台来模拟演示一下这个场景。[追求者xmw(小魔王),被追求者yangyang(羊羊)]

     1  /// <summary>
     2     /// 追求者
     3     /// </summary>
     4     class Pursuit
     5     {
     6         SchoolGirl mm;
     7         public Pursuit(SchoolGirl mm)
     8         {
     9             this.mm = mm;
    10         }
    11 
    12         public void GiveDolls()
    13         {
    14             Console.WriteLine($"{mm.Name}送你洋娃娃");
    15         }
    16         public void GiveFlowers()
    17         {
    18             Console.WriteLine($"{mm.Name}送你鲜花");
    19         }
    20         public void GiveChocolate()
    21         {
    22             Console.WriteLine($"{mm.Name}送你巧克力");
    23         }
    24     }
    25     /// <summary>
    26     /// 被追求者
    27     /// </summary>
    28     internal class SchoolGirl
    29     {
    30         public string Name { get; set; }
    31     }

    客户端调用:

     1  static void Main(string[] args)
     2         {
     3             SchoolGirl yangyang = new SchoolGirl();
     4             yangyang.Name = "羊羊";
     5             Pursuit xmw = new Pursuit(yangyang);
     6             xmw.GiveDolls();
     7             xmw.GiveFlowers();
     8             xmw.GiveChocolate();
     9             Console.ReadKey();
    10         }

    好了,大家一眼就可以发现问题了,上述代码描述的是我直接送礼物给心仪的女孩子,没有经过我的好朋友来帮忙。

    2、第二步演绎

    好,下面我们来修改一下,让好朋友[qihe(齐贺)] 来帮忙送给她。

     1 class Proxy
     2     {
     3         SchoolGirl mm;
     4         public Proxy(SchoolGirl mm)
     5         {
     6             this.mm = mm;
     7         }
     8 
     9         public void GiveDolls()
    10         {
    11             Console.WriteLine($"{mm.Name}送你洋娃娃");
    12         }
    13         public void GiveFlowers()
    14         {
    15             Console.WriteLine($"{mm.Name}送你鲜花");
    16         }
    17         public void GiveChocolate()
    18         {
    19             Console.WriteLine($"{mm.Name}送你巧克力");
    20         }
    21     }
    22     internal class SchoolGirl
    23     {
    24         public string Name { get; set; }
    25     }

    客户端:

     1   static void Main(string[] args)
     2         {
     3             SchoolGirl yangyang = new SchoolGirl();
     4             yangyang.Name = "羊羊";
     5             Proxy qihe = new Proxy(yangyang);
     6             qihe.GiveDolls();
     7             qihe.GiveFlowers();
     8             qihe.GiveChocolate();
     9             Console.ReadKey();
    10         }

    靠,你耍我呢,这不就等于把 小魔王 换成 齐贺 了吗,其他啥也没变,这样的话不就等于 齐贺 去追 羊羊了,没小魔王啥事了。

    其实这件事的本质就是,尽管礼物是通过齐贺送的,但是,礼物是小魔王买的,也是小魔王送给羊羊的。

    3、第三步演绎

    注意一下,齐贺 和 小魔王 都有一个共同的功能,就是送礼物这个功能,所以,我们可以将这个功能抽象成一个接口,让他俩都继承这个接口。

    好,下面我们再修改一下

     1  /// <summary>
     2     /// 送礼物的接口
     3     /// </summary>
     4     interface GiveGift
     5     {
     6         void GiveDolls();
     7         void GiveFlowers();
     8         void GiveChocoolate();
     9     }
    10     /// <summary>
    11     /// 追求者类(可以实例化成小魔王)
    12     /// </summary>
    13     class Pursuit : GiveGift
    14     {
    15         SchoolGirl yangyang;
    16         public Pursuit(SchoolGirl yangyang)
    17         {
    18             this.yangyang = yangyang;
    19         }
    20         public void GiveChocoolate()
    21         {
    22             Console.WriteLine($"{yangyang.Name}送你巧克力");
    23         }
    24 
    25         public void GiveDolls()
    26         {
    27             Console.WriteLine($"{yangyang.Name}送你洋娃娃");
    28         }
    29 
    30         public void GiveFlowers()
    31         {
    32             Console.WriteLine($"{yangyang.Name}送你鲜花");
    33         }
    34     }
    35     /// <summary>
    36     /// 代理类(可以实例化成齐贺)
    37     /// </summary>
    38     class Proxy : GiveGift
    39     {
    40         Pursuit xmw;
    41         public Proxy(SchoolGirl yangyang)
    42         {
    43             xmw = new Pursuit(yangyang);
    44         }
    45         public void GiveChocoolate()
    46         {
    47             xmw.GiveDolls();
    48         }
    49 
    50         public void GiveDolls()
    51         {
    52             xmw.GiveFlowers();
    53         }
    54 
    55         public void GiveFlowers()
    56         {
    57             xmw.GiveChocoolate();
    58         }
    59     }
    60     /// <summary>
    61     /// 被追求者(可以实例化成羊羊)
    62     /// </summary>
    63     internal class SchoolGirl
    64     {
    65         public string Name { get; set; }
    66     }

    客户端:

     1    static void Main(string[] args)
     2         {
     3             SchoolGirl yangyang = new SchoolGirl();
     4             yangyang.Name = "羊羊";
     5             Proxy qihe = new Proxy(yangyang);
     6             qihe.GiveDolls();
     7             qihe.GiveChocoolate();
     8             qihe.GiveFlowers();
     9             Console.ReadKey();
    10         }

    这样,尽管 new Proxy(), 而且也是调用的Proxy里的Give...() 方法,但是,可以看一下上面的代码,实质是追求者类的方法。

    这样也就解决了上述的问题,甚至SchoolGirl(羊羊)类都有可能不认识Pursuit(小魔王)类。

    ok,下面,下面我们一句话总结一下代理模式:为其他对象提供一种代理以控制对这个对象的访问。

    大家可以多写一写上述的代码,慢慢体会一下。

    还有,给大家一个生活中真真切切代理模式的例子: 《武林外传》22集最后,秀才让小六代其求婚。这就是典型的代理模式。

    好了,今天就到这吧,下一篇,会讲 工厂方法模式(不是简单工厂模式哦)


    本系列将持续更新,喜欢的小伙伴可以点一下关注和推荐,谢谢大家的支持。

  • 相关阅读:
    VC++实现感染文件式加载DLL文件
    vC++实现遍历桌面和快速启动里的所有快捷方式,判断快捷方式是不是浏览器,如果是则删除快捷方式参数
    VC++另类实现进程插入
    云服务系列:Windows Azure SDK for .NET(2012 年 6 月发布的版本)的最新消息
    VC++1.5K字节实现下载并远程注入
    上海求职指南 (最新版)
    WinAPI: GetWindowText 获取窗口标题
    WinAPI: SetCursorPos 设置鼠标指针位置
    WinAPI: SetComputerName 更改计算机名称
    GDI+ 学习记录(31): 图像颜色变换(TGPImageAttributes)
  • 原文地址:https://www.cnblogs.com/xiaomowang/p/6266034.html
Copyright © 2020-2023  润新知