通俗版说委托

假设

  今天天气不错,挺风和日丽的...

  你心情很不错,给了老婆100.00,给了儿子100.00让他们自己去消费。

  然后,你发现钱包空了,“卧槽,哥他妈就200块钱,都给出去了,还让不让人活了”,立马给儿子和老婆,打电话,只是电话里一直,“嘟,嘟,嘟...”。

  然后,就没有然后了...

  这都不是重点,作为一个天生励志的程序猿,眼里一切只有代码

1         public static void Shop(string name, decimal total, Func<decimal, decimal> shopping)
2         {
3             var balance = shopping(total);
4             Console.WriteLine("{0}购物后剩余{1:C}", name, balance);
5         }

  事件一,龟儿子拿到钱后

  "烂天气,惹死老,整个西瓜中哈子",于是儿子花了20.5块买了个西瓜

        public static decimal BuyWatermelon(decimal total)
        {
            return total - 20.50m; 
        }
            Shop("龟儿子", 100.00m, BuyWatermelon);

  事件二,你婆娘拿到钱后

  “好不容易儿子不在家,好久没有啪啪啪...”,于是,老婆买羞羞去了

        public static decimal BuyDurex(decimal total)
        {
            return total - 10.00m;
        }
   Shop("婆娘", 100.00m, BuyDurex);

  看到这里,部分博友要开骂了"屌丝流年,就会写人妻与儿子的故事,滚粗博客园,不要污染园子..." 

  这都不是重点,重点是这个故事可以简单概括为,一个人给了他老婆儿子各100块让他们自己去购物,然后他们可以任意的去花这笔钱,只是最后的时候把剩余的钱显示了出来。

  其实,代码开发中的委托和现实中的委托是一个道理。比如你想买菜,然后让你儿子去买是一样,所有我们就有:

  你想买菜这个行为(定义函数“模板”);

  你知道你的儿子会买菜(儿子类定义了买菜函数,但是你不知道他怎么去买,是坐车去?还是走路去?去了哪家店?);

  然后你委托给你的儿子(将儿子买菜的行为替换了你买菜的行为),你现在可以把儿子理解成你的傀儡;

  最后就是儿子去买菜了(有的时候你需要关注儿子是不是把菜买回来了,有的时候你根本不关心什么时候回来,也就是有没有返回值)。

  现在,我们把代码放在一起来看,当然这个例子没有上升到类的层次,就是个简单的Program。

 1         static void Main(string[] args)
 2         {
 3             Shop("龟儿子", 100.00m, BuyWatermelon);
 4             Shop("婆娘", 100.00m, BuyDurex);
 5             Console.ReadKey();
 6         }
 7 
 8 
 9         public static void Shop(string name, decimal total, Func<decimal, decimal> shopping/*消费*/)
10         {
11             var balance = shopping(total);
12             Console.WriteLine("{0}购物后剩余{1:C}", name, balance);
13         }
14 
15         public static decimal BuyWatermelon(decimal total)
16         {
17             return total - 20.50m; 
18         }
19 
20         public static decimal BuyDurex(decimal total)
21         {
22             return total - 10.00m;
23         }
View Code 

问题

  看到这,部分博友又开始卷了“内个勒逼,直接就可以用方法,还用个毛委托”

 1         static void Main(string[] args)
 2         {
 3             Shop("龟儿子", 100.00m, 25.5m);
 4             Shop("婆娘", 100.00m, 10);
 5             Console.ReadKey();
 6         }
 7 
 8         public static void Shop(string name, decimal total, decimal shopping/*消费*/)
 9         {
10             var balance = total - shopping;
11             Console.WriteLine("{0}购物后剩余{1:C}", name, balance);
12         }

  回答:如果你的程序就是这么简单的加减,然后打印,连Shop方法都可以省了,直接一句话输出就得了。

 Console.WriteLine("龟儿子购物后剩余{0:C}", 100.00m-25.5m);

  又有博友开卷了,“那按你的意思,是不是代码越复杂越好啊”。

  

  “好代码和复杂度有毛关系???”

  ...

  如果你现在已经看得云里雾里,不知流年扯了半天都讲了些什么屁玩意,好的,没关系,这都不是重点。

  重点是,“.Net通过使用委托来提供了一种回调函数机制,实现了对扩展开放,对修改关闭的原则”,把这句话默默的背上一百遍,你就知道什么是委托了。

posted @ 2015-06-17 15:52  高效养猪倌  阅读(1827)  评论(17编辑  收藏  举报