通俗版说委托
假设
今天天气不错,挺风和日丽的...
你心情很不错,给了老婆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 }
问题
看到这,部分博友又开始卷了“内个勒逼,直接就可以用方法,还用个毛委托”
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通过使用委托来提供了一种回调函数机制,实现了对扩展开放,对修改关闭的原则”,把这句话默默的背上一百遍,你就知道什么是委托了。