• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#中观察者模式的3种实现方式

C#中观察者模式的3种实现方式

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#观察者模式,观察者模式 实现,c#观察者设计模式,观察者模式,我的世界观察者模式等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

说起观察者模式,估计在园子里能搜出一堆来。所以写这篇博客的目的有两点:

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);
        }
</div>

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();
            }
        }
</div>

其他代码并不重要,重点在当闹铃时间到了后要执行ItIsTimeToAlarm(); 我们在这里发出事件以便通知订阅者,.net中实现event模型有三要素,

1.为主题(subject)要定义一个event, public event Action<Clock, AlarmEventArgs> Alarm;

2.为主题(subject)的信息定义一个EventArgs,即AlarmEventArgs,这里面包含了事件所有的信息

3.主题(subject)通过以下方式发出事件
var args = new AlarmEventArgs(_alarmTime.Value, 0.92m);
 OnAlarmEvent(args);
</div>

OnAlarmEvent方法的定义
public virtual void OnAlarm(AlarmEventArgs e)
       {
           if(Alarm!=null)
               Alarm(this,e);
       }
</div>
这里要注意命名,事件内容-AlarmEventArgs,事件-Alarm(动词,例如KeyPress),触发事件的方法 void OnAlarm(),这些元素都要符合事件模型的命名规范。
智能闹钟(SmartClock)已经实现完毕,我们在牛奶加热器(MilkSchedule)中订阅这个Alarm消息:
public void PrepareMilkInTheMorning()
        {
            _clock.Alarm += (clock, args) =>
            {
                Message =
                    "Prepraring milk for the owner, The time is {0}, the electric quantity is {1}%".FormatWith(
                        args.AlarmTime, args.ElectricQuantity*100);
 
                Console.WriteLine(Message);
            };
 
            _clock.SetAlarmTime(TimeSpan.FromSeconds(2));
 
        }
</div>

在面包烘烤机中同样可以用_clock.Alarm+=(clock,args)

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C# 设计模式系列教程-观察者模式
  • C#中观察者模式的3种实现方式
  • C#观察者模式(Observer Pattern)实例教程
  • C#中委托和事件在观察者模式中的应用实例
  • 简单的观察者模式示例分享
  • C# 观察者模式实例介绍

相关文章

  • 2017-05-28C# GDI在控件上绘图的方法
  • 2017-05-28C#数组学习相关资料整理
  • 2017-05-28c#与WMI使用技巧集第1/2页
  • 2017-05-28分享两种实现Winform程序的多语言支持的多种解决方案
  • 2017-05-28比较2个datatable内容是否相同的方法
  • 2017-05-28适合初学者开发的C#在线英汉词典小程序
  • 2017-05-28C#创建IIS虚拟目录的方法
  • 2017-05-28C#将隐私信息(银行账户,身份证号码)中间部分特殊字符替换成*
  • 2017-05-28.NET中的Timer类型用法详解
  • 2017-05-28C#解码base64编码二进制数据的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#影院售票系统毕业设计(2)
    • C#生成影像金字塔的原理实例
    • .Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用
    • 解析C#编程的通用结构和程序书写格式规范
    • C#中Arraylist的sort函数用法实例分析
    • C#画笔Pen使用路径绘制图形的方法
    • 详解C# Socket异步通信实例
    • 基于Silverlight打印的使用详解,是否为微软的Bug问题
    • C#基于TimeSpan实现倒计时效果的方法
    • C#枚举数值与名称的转换实例分享

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有