Event
何为事件呢?简单的举个例子,我们学校有个校花,很多的狼都注视着,可是当她进入男生无法监视的地方,我们就需要间谍打入她的内部。所以谁要是想知道校花在干什么,只要把我们的手机号码给这个间谍,只要校花有什么举动时,她就会发信息给我们,当然你要是想知道校花在干什么,你必须给间谍你的号码以及一些好处。
学过设计模式的人应该很清楚这是一个观察者模式。我们先使用标准的观察者模式来还原这个举动,然后再使用DELEGATE来实现,并由此来揭示令初学者郁闷的事件。
public interface 色狼
{
void 通知(string 通知的内容);
}
{
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 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 色狼列表)
{
色狼.通知(内容);
}
}
}
{
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);
王婆.看见校花去食堂();
王婆.看见校花出去约会();
}
{
色狼甲 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.通知));
王婆.看见校花去食堂();
王婆.看见校花出去约会();
}
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的事件就是一个用委托列表来实现的观察者模式。