码迷,mamicode.com
首页 > 其他好文 > 详细

委托—可扩展

时间:2015-03-11 19:44:20      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:委托   可扩展   

   其实研究了半天,最后发现其实不管什么最终的目的就是解耦和,可扩展。

   对于委托来说,用一句最直接的话来说,就是代替了if-else(switch)语句。举例:

class Program
        {
            //定义一个枚举,作为判断的依据
            public enum Language
            {
                 English, Chinese
            }
//两种语言问候的方法
 public void EnglishGreeting(string name)
            {
                Console.WriteLine("Morning, " + name);
            }
            public void ChineseGreeting(string name)
            {
               Console.WriteLine("早上好 ," + name);
            }
//GreetPeople执行选择语言的方法
 public void GreetPeople(string name, Language lang)
            {
              switch (lang)
              {
                   case Language.English:
                        EnglishGreeting(name);
                       break;
                   case Language.Chinese:
                       ChineseGreeting(name);
                        break;
               }
            }
   主函数:

//主函数显示问候语
  static void Main(string[] args)
            {
                GreetPeople("huohuo", EnglishGreeting);
                GreetPeople("霍霍", ChineseGreeting);
                Console.ReadKey();

   而当我们再加几种语言的问候语的时候,为了避免循环语句的出现,以及对枚举类型改动

   违背的原则:OOP中的OCP(对扩展开放,对修改关闭)原则。于是:

   我们引用了“委托”的概念,对于上个问候的小例子,我们可以这样来考虑:

   增加一个GreetingManager来封装一下:

 //定义委托,它定义了可以代表的方法的类型。
    public delegate void GreetingDelegate(string name);

    public class GreetingManager
    {
        public GreetingDelegate delegate1;
        public void GreetPeople(string name)
        {
            if (delegate1 != null)
            {
                delegate1(name);
                //MakeGreeting(name);
            }
        }
   对于委托是用静态方法来修饰的:

 public static void EnglishGreeting(string name)
            {
                Console.WriteLine("Morning, " + name);
            }
            public static void ChineseGreeting(string name)
            {
                Console.WriteLine("早上好 ," + name);
            }
   主函数直接调用的结果:

 GreetingManager gm = new GreetingManager();

                gm.delegate1 = EnglishGreeting;
                gm.delegate1 += ChineseGreeting;

                gm.GreetPeople("huohuo");

   例子看完了,现在我们来了解一下,

什么是委托?

  • 委托是一个类,它定义了方法的类型,使得可以将方法作为一个方法的参数来进行传递(也就是将方法作为方法的参数);

技术分享技术分享

  • 类是对象的抽象,而委托是函数的抽象;
  • 一个委托代表了具有相同参数列表和返回值的所有函数;

为什么要用委托?

  • 相当于用方法作为另一方法参数,避免在程序中大量的使用If-else(Switch)语句,也就是刚开始所列举的例子;
  • 使程序具有更好的可扩展性,满足OCP原则;
  • 在两个不能直接调用的方法中作为桥梁,如:在多线程中的跨线程的方法调用就得用委托;

   对于委托,其实也只是了解的这点而已,好处也只是明白了前两点,对于第三点的实践等待验证。






委托—可扩展

标签:委托   可扩展   

原文地址:http://blog.csdn.net/huo065000/article/details/44200857

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!