其实研究了半天,最后发现其实不管什么最终的目的就是解耦和,可扩展。
对于委托来说,用一句最直接的话来说,就是代替了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");
对于委托,其实也只是了解的这点而已,好处也只是明白了前两点,对于第三点的实践等待验证。
原文地址:http://blog.csdn.net/huo065000/article/details/44200857