没有合适的资源?快使用搜索试试~ 我知道了~
主要介绍了C#中观察者模式的3种实现方式,本文讲解了利用.net的Event模型来实现、利用.net中IObservable<out>和IObserver<in>实现观察者模式、Action函数式方案等3种方法,需要的朋友可以参考下
资源推荐
资源详情
资源评论
C#中观察者模式的中观察者模式的3种实现方式种实现方式
主要介绍了C#中观察者模式的3种实现方式,本文讲解了利用.net的Event模型来实现、利用.net中IObservable和
IObserver实现观察者模式、Action函数式方案等3种方法,需要的朋友可以参考下
说起观察者模式,估计在园子里能搜出一堆来。所以写这篇博客的目的有两点:
1.观察者模式是写松耦合代码的必备模式,重要性不言而喻,抛开代码层面,许多组件都采用了Publish-Subscribe模式,所以
我想按照自己的理解重新设计一个使用场景并把观察者模式灵活使用在其中
2.我想把C#中实现观察者模式的三个方案做一个总结,目前还没看到这样的总结
现在我们来假设这样的一个场景,并利用观察者模式实现需求:
未来智能家居进入了每家每户,每个家居都留有API供客户进行自定义整合,所以第一个智能闹钟(smartClock)先登场,厂家为
此闹钟提供了一组API,当设置一个闹铃时间后该闹钟会在此时做出通知,我们的智能牛奶加热器,面包烘烤机,挤牙膏设备都
要订阅此闹钟闹铃消息,自动为主人准备好牛奶,面包,牙膏等。
这个场景是很典型观察者模式,智能闹钟的闹铃是一个主题(subject),牛奶加热器,面包烘烤机,挤牙膏设备是观察者
(observer),他们只需要订阅这个主题即可实现松耦合的编码模型。让我们通过三种方案逐一实现此需求。
一、利用一、利用.net的的Event模型来实现模型来实现
.net中的Event模型是一种典型的观察者模式,在.net出身之后被大量应用在了代码当中,我们看事件模型如何在此种场景下使
用,
首先介绍下智能闹钟,厂家提供了一组很简单的API
复制代码 代码如下:
public void SetAlarmTime(TimeSpan timeSpan)
{
_alarmTime = _now().Add(timeSpan);
RunBackgourndRunner(_now, _alarmTime);
}
SetAlarmTime(TimeSpan timeSpan)用来定时,当用户设置好一个时间后,闹钟会在后台跑一个类似于while(true)的循环对比
时间,当闹铃时间到了后要发出一个通知事件出来
复制代码 代码如下:
protected void RunBackgourndRunner(Func<DateTime> now,DateTime? alarmTime )
{
if (alarmTime.HasValue)
{
var cancelToken = new CancellationTokenSource();
var task = new Task(() =>
{
while (!cancelToken.IsCancellationRequested)
{
if (now.AreEquals(alarmTime.Value))
{
//闹铃时间到了
ItIsTimeToAlarm();
cancelToken.Cancel();
}
cancelToken.Token.WaitHandle.WaitOne(TimeSpan.FromSeconds(2));
}
}, cancelToken.Token, TaskCreationOptions.LongRunning);
task.Start();
}
}
其他代码并不重要,重点在当闹铃时间到了后要执行ItIsTimeToAlarm(); 我们在这里发出事件以便通知订阅者,.net中实现
event模型有三要素,
1.为主题(subject)要定义一个event, public event Action<Clock, AlarmEventArgs> Alarm;
2.为主题(subject)的信息定义一个EventArgs,即AlarmEventArgs,这里面包含了事件所有的信息
资源评论
weixin_38558660
- 粉丝: 2
- 资源: 937
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功