博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别...
阅读量:6201 次
发布时间:2019-06-21

本文共 1761 字,大约阅读时间需要 5 分钟。

在""中,曾经通过接口的方式、委托与事件的方式实现过观察者模式。本篇体验使用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表达式、事件系列”包括:

转载地址:http://optca.baihongyu.com/

你可能感兴趣的文章
Android进阶:打jar包获取assets中的资源 解决selector XML文件不能解析的问题
查看>>
[转载]SharePoint 2013搜索学习笔记之自定义结果源
查看>>
上传文件
查看>>
python manage.py startapp app 时候报错No module named _sqlite3
查看>>
11.02 跳过表中n行
查看>>
360遭下架,苹果商店封杀360手机应用
查看>>
2、AD工程创建步骤
查看>>
OO第三次博客作业
查看>>
[转]手把手教你做iOS推送
查看>>
Java公众号推荐 - BeJavaGod
查看>>
iptables规则组成
查看>>
面向对象
查看>>
NEFU OJ 205 最小树(一)
查看>>
hdu 新生晚会
查看>>
python socket网络编程
查看>>
java @override 报错处理
查看>>
docker数据管理--数据卷的备份
查看>>
selenium弹出框的处理
查看>>
hyperledger中文文档学习-1-词汇表
查看>>
Mantle 初步使用
查看>>