Event

 

何为事件呢?简单的举个例子,我们学校有个校花,很多的狼都注视着,可是当她进入男生无法监视的地方,我们就需要间谍打入她的内部。所以谁要是想知道校花在干什么,只要把我们的手机号码给这个间谍,只要校花有什么举动时,她就会发信息给我们,当然你要是想知道校花在干什么,你必须给间谍你的号码以及一些好处。
学过设计模式的人应该很清楚这是一个观察者模式。我们先使用标准的观察者模式来还原这个举动,然后再使用DELEGATE来实现,并由此来揭示令初学者郁闷的事件。

public interface  色狼
{
      
void 通知(string 通知的内容);
}

 

public class 色狼甲:色狼
{
     
public const string PHONE="138******";
     
public void 通知(string 通知的内容)
     
{
          
if(通知的内容=="去食堂吃饭")
             去食堂();
     }

}

public class 色狼乙:色狼
{
{
     
public const string PHONE="139******";
     
public void 通知(string 通知的内容)
     
{
          
if(通知的内容=="跟别人约会")
             郁闷一天();
     }

}

}

 

public class 间谍
{
     
private List<色狼>  色狼列表=new List<色狼>;
     
public void Add(色狼 又是一只狼)
     
{
         色狼列表.Add(又是一只狼);
     }


     
public void Remove(色狼 疲惫的色狼)
     
{
     色狼列表.Remove(疲惫的色狼);
     }

     
public void 看见校花去食堂()
     
{
         通知色狼(
"去食堂吃饭");
     }

     
public void 看见校花出去约会()
     
{
         通知色狼(
"出去约会");
     }


     
private void 通知色狼(string 内容)
     

        foreach(色狼 item 
in 色狼列表)
        
{
            色狼.通知(内容);
        }

     }

    
}
 

 

static void Main(string[] args)
{
    色狼甲 A
=new 色狼甲();
    色狼乙 B
=new 色狼乙();
    间谍 王婆
=new 间谍();
    王婆.Add(A);
    王婆.Add(B);
    王婆.看见校花去食堂();
    王婆.看见校花出去约会();
}


在上一讲中,我讲解了Delegate和interface的转换来实现相同的功能,这一次我们将反过来将用interface实现的观察者模式改成Delegate版的。事实上interface就是规定所有的色狼都必须实现通知这个方法,而用Delegate这种强类型同样可以实现这个约束。

public delegate void 通知(string 通知内容);

public class 间谍
{
     
private List<通知>  色狼列表=new List<通知>;
     
public void Add(通知 又是一只狼)
     
{
         色狼列表.Add(又是一只狼);
     }


     
public void Remove(通知 疲惫的色狼)
     
{
     色狼列表.Remove(疲惫的色狼);
     }

     
public void 看见校花去食堂()
     
{
         通知色狼(
"去食堂吃饭");
     }

     
public void 看见校花出去约会()
     
{
         通知色狼(
"出去约会");
     }


     
private void 通知色狼(string 内容)
     

        foreach(色狼 item 
in 色狼列表)
        
{
            色狼.通知(内容);
        }

     }

}
 
static void Main(string[] args)
{
    色狼甲 A
=new 色狼甲();
    色狼乙 B
=new 色狼乙();
    间谍 王婆
=new 间谍();
    王婆.Add(
new delegate(A.通知));
    王婆.Add(
new delegate(B.通知));
    王婆.看见校花去食堂();
    王婆.看见校花出去约会();
}

很高兴的是,.net中的Evnet就相当于List,而+=就相当于List.Add(),-=就相当于List.Remove();
所以.net中Evnet事实上是一个委托列表,.net的事件就是一个用委托列表来实现的观察者模式。

posted @ 2008-02-26 21:20  BigRain  阅读(484)  评论(2编辑  收藏  举报