zoukankan      html  css  js  c++  java
  • 代理模式(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集最后,秀才让小六代其求婚。这就是典型的代理模式。

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


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

  • 相关阅读:
    JAVA基础——编程练习(二)
    JAVA基础——面向对象三大特性:封装、继承、多态
    JVM内存
    50. Pow(x, n) (JAVA)
    47. Permutations II (JAVA)
    46. Permutations (JAVA)
    45. Jump Game II (JAVA)
    43. Multiply Strings (JAVA)
    42. Trapping Rain Water (JAVA)
    41. First Missing Positive (JAVA)
  • 原文地址:https://www.cnblogs.com/xiaomowang/p/6266034.html
Copyright © 2011-2022 走看看