我牵头,你做事——C#委托实践一
2007-09-05 23:54:54
标签:委托
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wangjierui.blog.51cto.com/186879/41225
计算机在不断的模拟人类现实世界,总有一天,在这个世界上将无法区分谁是计算机,谁是原生人……
(以下文字纯属个人理解,酌情参考)
直到如今,我们在管理上习惯于大包大揽,对事情总是喜欢制定出绝对的计划,非得弄出个一二三,然后对下属分配好任务,下属需要的只是服从,按照计划执行就可以了。而这样的工作方式,往往不能适应实际情况的变化。早在战国时期,就有“将在外,君命有所不受”的觉悟了,说这话的人如果做软件,将是功能扩展性编程的始祖。所谓功能扩展性编程就是将功能的具体实现放到程序外。如果我们在程序设计的时候,无法预料对于某个事件的处理程序究竟是什么样的,那就“委托”给使用者去自行处理,当然,使用者必须和我们签订一份协议,遵循我们的规范。把这个理念放到C#编程中,就是委托(Delegate)。
比如,我们最常用的控件之一——Button,微软在制作这个控件的时候,对于点击事件已经实现了一部分功能,那就是压下去又弹上来。可是我们拽一个按钮到窗体上,当然不是看它弹上弹下的,而是希望他能处理某些功能,比如张三想用来播放一首歌,李四想用来弹出另外一个窗体等等。对于这种情况,微软干脆来了个委托,把责任推卸给开发人员自己去实现,出了问题,开发人员难逃其咎,这招实在是高明。要不然我们怎么办?难道要微软开发一个点击后可以播放音乐的按钮?或者点击可以弹出一个窗口的按钮?活都让微软做了,我们程序员还靠什么吃饭^_^
说了这么多,委托也就差不多清楚了。委托协议将原计划与实际活动联系起来,落实到编程语言中就是用指针将各个实现方法联系起来。比如Button控件在原有的压下弹上的功能基础上,用EventHandler委托关系连接到Button_Click上,就实现了一连串动作:压下,弹上来,播放一段音乐。当然我们可以用“多播”的方式,关联到更多的功能上去,就和串糖葫芦一样。记住,糖葫芦是有顺序的。
今晚碰到了一个问题,想来想去用委托实现最为简单,拿出来作为一个应用例子吧:
我在一个解决方案中,使用了A,B,C三个程序集,其中依赖关系如上图。本来,我在A中有如下代码
if(C.Method()) A.Method();
即A依赖于C的某个动作而需要作出反应。后来,我在B中也需要做如上动作,但如何在B中使用A的代码呢?在尽量避免互相引用的原则下,虽然考虑到用反射,但是最终觉得用委托是最方便的解决方案。
既然动作都是由C牵头的,则由C做一个委托类型,A中实现C的委托。这样的话,如果B找C做事情,C做了自己该做的,剩下的就委托给A来做,间接实现B调用A的代码。这也是设计模式中常用的手段,在很多场合,委托可以代替接口实现间接调用。
本文出自 “王杰瑞的技术博客” 博客,请务必保留此出处http://wangjierui.blog.51cto.com/186879/41225