委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
2014-10-02 11:44
921 查看
在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式、委托与事件的方式实现过观察者模式。本篇体验使用Action实现此模式,并从中体验委托与事件的区别。□ 使用Action实现观察者模式就举一个足球场上的例子,当裁判吹响终场哨,胜队庆祝,失败队落寞。把裁判看作是被观察者,比赛中的两队看作是观察者。裁判作为被观察者需要提供一个Action委托供观察者方法注册。
public class Referee
{
public Action DoSth;
public void ISayGameOver()
{
Console.WriteLine("嘀嘀嘀......比赛结束了~~");
DoSth();
}
}胜利的队和失败的队拥有共同的基类。
public class Team
{
private string _name;
public Team(string name)
{
_name = name;
}
public string Name
{
get { return _name; }
}
}胜利队或失败队,作为观察者,必须有符合Referee中Action定义的方法。
public class WinTeam : Team
{
public WinTeam(string name) : base(name){}
public void Celebrate()
{
Console.WriteLine("我们晋级了,好开心!");
}
}
public class LoseTeam : Team
{
public LoseTeam(string name) : base(name){}
public void WeAreSad()
{
Console.WriteLine("比赛输了,好伤心!");
}
}客户端,先把失败队和胜利队的方法注册到Action变量,然后由被观察者的一个方法触发委托链和方法。
static void Main(string[] args)
{
Referee referee = new Referee();
var winTeam = new WinTeam("胜利队");
var loseTeam = new LoseTeam("失败队");
//注册观察者
referee.DoSth += winTeam.Celebrate;
referee.DoSth += loseTeam.WeAreSad;
//被观察者启动事件通知观察者
referee.ISayGameOver();
}□ 体验委托与事件的区别现在,我们在客户端,在调用Referee的实例方法ISayGameOver之前,尝试把Referee的委托变量DoSth设置为null。
static void Main(string[] args)
{
Referee referee = new Referee();
var winTeam = new WinTeam("胜利队");
var loseTeam = new LoseTeam("失败队");
//注册观察者
referee.DoSth += winTeam.Celebrate;
referee.DoSth += loseTeam.WeAreSad;
referee.DoSth = null;
//被观察者启动事件通知观察者
referee.ISayGameOver();
}可见,当把把Referee的委托变量DoSth设置为null后,所有注册的方法将得不到执行。如果把Referee的委托变量DoSth修饰为事件。
public class Referee
{
public event Action DoSth;
public void ISayGameOver()
{
Console.WriteLine("嘀嘀嘀......比赛结束了~~");
if (DoSth != null)
{
DoSth();
}
}
}可见,当把委托变量DoSth修饰为事件后,只能通过+=和-=注册、取消方法,不能通过=设置。把referee.DoSth = null;注释掉,将不会报错。“委托、Lambda表达式、事件系列”包括:
委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性
委托、Lambda表达式、事件系列02,什么时候该用委托
委托、Lambda表达式、事件系列03,从委托到Lamda表达式
委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理
委托、Lambda表达式、事件系列05,Action委托与闭包
委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
委托、Lambda表达式、事件系列07,使用EventHandler委托
相关文章推荐
- 委托、Lambda表达式、事件系列07,使用EventHandler委托
- 使用委托和事件实现观察者模式(Observer Pattern)
- 如何使用委托与事件来实现观察者模式
- C#中使用委托和事件实现观察者模式(observer pattern)
- 委托、Lambda表达式、事件系列05,Action委托与闭包
- C#中使用委托和事件实现观察者模式(observer pattern)
- 使用委托和事件实现观察者模式(Observer Pattern)
- WCF中使用观察者模式实现事件通知
- 委托、Lambda表达式、事件系列03,从委托到Lamda表达式
- 班主任来啦之观察者模式,事件委托等Java实现---如果你还不懂,看完此文,就一定会懂
- 事件委托实现观察者模式
- c#观察者模式和事件委托的联合使用
- WCF中使用观察者模式实现事件通知
- 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理
- .Net中使用事件和委托实现Observer模式(一)
- 使用UnrealScript实现基于观察者模式的事件系统
- 委托、Lambda表达式、事件系列02,什么时候该用委托
- 在C#中使用代理(即委托)的方式触发事件(观察者模式)
- 委托、事件、Observer观察者模式的使用解析二
- 委托 事件 实现观察者模式