时间:2015-1-13来源:不详作者:佚名
收藏    我要投稿

简单谈一下对委托的认识,算是对这篇博客( 这里)的理解和概括吧!


委托(Delegate)首先可以看做一个特殊的类,而一些函数是他的变量取值范围。

如声明一个委托:public delegate void GreetingDelegate(string name);那么我们在别的函数中把函数名当做变量传进来,这样子就可以调用相应的函数了。委托应该先声明才能用,注意作用范围。在任意函数里就可以用这个委托了。public void GreetingPeople(string name, GreetingDelegate MakeGreeting); 第二个参数就可以赋值为不同的函数名。可以这样子 调用这个函数,GreetingPeople("Bruce", ChineseGreering); 或者 GreetingPeople(string name, EnglishGreeting); 注意这里的两个函数 ChineseGreeting 和 EnglishGreeting 得和GreetingDelegate的类型一样(返回值,参数)。

我们可以声明一个委托类型,并把函数赋值(或者说改叫绑定了)过来,如 GreetingDelegate delegate1; delegate1 = EnglishGreeting; delegate1 += ChineseGreeting; 这样子可以同时调用两个函数了,当然,这里的参数是一样的。

这里的 delegate1 既然是一个特殊的函数,那么就可以像函数那样直接调用:delegate1("Bruce"); 效果是一样的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    public delegate void GreetingDelegate(string name);
    class Program
    {
        private static void EnglishGreeting(string name)
        {
            Console.WriteLine("Good morning!  " + name);
        }

        private static void ChineseGreeing(string name)
        {
            Console.WriteLine("您好!  " + name);
        }

        private static void Greeting(string name, GreetingDelegate MakeGreeting)
        {
            MakeGreeting(name);
        }

        static void Main(string[] args)
        {
            GreetingDelegate delegate1, delegate2;
            delegate1 = ChineseGreeing;
            delegate1 += EnglishGreeting;
            delegate2 = EnglishGreeting;
            Greeting("张小彬", delegate1);
            Greeting("Bruce", delegate2);
            Console.ReadKey();
            
        }
    }
}



事件(Event)是一个特殊的委托变量,只是封装了委托类型的变量。

event 和 delegate1 只是访问权相不一样,对委托的变量,类型定义为public(太暴露)和private(失去作用)都不合适,于是event出现了。事件变量(或者说委托变量)在类的内部相当于是私有的,在外部只能有+=和-=操作。


Observer设计模式

Observer设计模式有两类身份,一个叫做Subject,即目标,监视的对象;另一个叫做Observer,即监视者。Subject一旦有某些特定的行为(如学生,作弊的行为),那么注册过的Observer会相应该行为(如老师,立刻过去没收考卷)。Observer设计模式是一种松耦合的设计模式。我们一般在Subject中定义事件(Event)和触发规则。下面是一个加热器的例子,显然不符合微软的规范,但是对理解概念很有帮助

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    public class Heater
    {
        private int temperature;
        public delegate void NowHandler(string param);
        public event NowHandler MyEvent;

        public void heat()
        {
            for (int i = 0; i <= 100; ++i)
            {
                temperature = i;
                if (temperature > 95)
                {
                    MyEvent(i + "");
                }
            }
        }
    }

    public class Alarm
    {
        public void AlarmNow(string param)
        {
            Console.WriteLine("Alarm: Fire! Fire!" + param);
        }
    }

    public class Display
    {
        public void DisplayNow(string param)
        {
            Console.WriteLine("Display: Fire! Fire!" + param);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Heater heater = new Heater();
            Alarm alarm = new Alarm();
            Display display = new Display();
            heater.MyEvent += alarm.AlarmNow;
            heater.MyEvent += display.DisplayNow;
            heater.heat();
            Console.ReadKey();
        }
    }
}




转载请注明原文网址:http://www.helimiaopu.com/cksc/cksc/38.html
------分隔线----------------------------