《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 2159|回复: 2
收起左侧

[样章] 事件与听众的概念

[复制链接]
发表于 2014-7-10 10:27:25 | 显示全部楼层 |阅读模式
本帖最后由 zhanggx 于 2014-7-10 13:57 编辑

MATLAB面向对象程序设计可以通过事件的发生与否来实现各个对象之间的通信联系,并完成一些指定的动作,即用事件的发生来触发指定函数的调用过程。这一点类似于Visual C++中的“消息传递(message based),事件驱动(event driven)”的运行机制。本章将主要介绍事件和听众的概念,以及如何使用事件模型来实现基于事件驱动的具有交互响应功能的程序设计过程。
8.1  事件与听众的概念
8.1.1  事件的概念及事件模型
什么是事件(event)呢?事件的含义很广泛。一般来说,从程序上可探测到的任何动作,都能够产生相应的事件,并可以将该事件的发生告知其他对象,来实现对象之间的通信。这里事件是用来标识发生的某件事情的。
在MATLAB面向对象程序设计中,事件表示发生在类实例(对象)中的某些变化或行为,这些变化包括:
(1)对类(对象)中数据的修改;
(2)方法的执行;
(3)查询或设置一个属性成员值;
(4)析构一个对象。
在MATLAB中,事件驱动和事件响应过程构成了一个完整的事件模型。组织一个事件模型的一般步骤如下。
(1)命名事件:在一个handle型类中声明一个标识符来代表事件,这个类就是产生事件的类,简称事件类,相应的实例称为事件对象;
(2)创建听众:在一个类中声明事件后,就可以关联一个相应的听众,一般用addlistener函数来定义听众;
(3)定义一个方法来确定何时触发这个事件,并通过notify函数对听众进行广播来告之该事件的发生;
(4)定义回调函数:当听众接收到某事件发生的信息时,就会去执行一个与之关联的回调函数,因此还要定义一个回调函数。
在定义听众时,既可将该听众与产生事件的对象生命周期进行绑定,也可将其限制在听众对象的生存期和作用范围内。
图8-1给出了一个简单事件模型的示意图,其中时钟类Mclock对象的事件块中有Alarm事件,因此它是产生事件的对象。用户通过调用方法AlarmSetChange类触发事件Alarm,然后通过Notify函数将事件广播给听众Listener1、Listener2和Listener3。由于听众Listener1的成员EvenName的值与事件Alarm名称匹配,于是MATLAB就去调用听众Listener1中通过FunctionHandle注册的回调函数Fun1。

图8-1  事件模型示意图
8.1.2  听众的概念
在上面的事件模型中,多次提到了听众,那么什么是听众(listener)呢?在MATLAB中,听众是用来接收事件发生消息的对象,是event.listener类型的对象。在MATLAB面向对象程序设计中,定义一个听众可以采用两种方法:一种方法是使用handle类中的addlistener函数;另外一种方法是直接调用event.listener类的构造函数。具体定义方法将在下节介绍。
一旦听众创建后,它会一直等待事件发生的消息,一旦关联的事件发生了,听众就会执行一个回调函数。这里event.listener类是handle的子类,表8-1给出了event.listener的全部新增特性。
表8-1  event.listener类属性成员表
属性成员        意    义
Source        事件对象元胞数组
EventName        事件名
Callback        事件触发时执行的回调函数(这时需要将特性Enabled设置为true)
Enabled        是否执行回调函数的开关(默认值是true)
Recursive        回调函数是否递归调用(默认值是false)
MATLAB面向对象程序设计-海报.png
发表于 2014-11-10 08:43:26 | 显示全部楼层
,楼主有没有PDF文件呀,谢谢楼主
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-23 16:47:12 | 显示全部楼层
亲爱的,购买本书看看吧,多谢支持
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号-2 

GMT+8, 2022-12-5 23:17 , Processed in 0.063983 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表