本系列内容为《MATLAB面向对象编程–从入门到设计模式》学习笔记,特此说明。
事件泛指对象内部状态的改变。在MATLAB中,GUI编程经常使用事件机制。
e.g. GUI中一个按钮被按下就是一个事件,并且Button对象状态改变。
通常,事件会触发一些响应。
在事件发生和触发响应这样的模式中,通常把改变内部状态的对象叫作发布者,把监听事件并做出响应的对象叫作观察者。利用MATLAB OOP ,用户可以定义类的事件。一个发布者可以拥有多个事件,一个观察者可以监听多个事件。
事件和响应一般用来在对象之间相互传递信息,因为其应用广泛,故MATLAB在句柄基类内部就已经实现了这个功能。
任何定义的Handle类都已经继承了Handle 基类中与事件相关的功能,因此继承了Handle基类的类,查看该类所支持的方法,会发现其中有两个方法:addlistener 、 notify
MATLAB规定,事件的定义要放在event block 中。
classdef Someclass < handle
......
events %event block开始
DataChanged
end %event block结束
......
function interalDataChange(obj)
obj.notify('dataChanged'); %通知数据改变,各个GUI更新
end
end
SomeClass类拥有继承自Handle基类的notify方法,该方法的作用是监视其数据变化的对象发布事件的消息。
Handle 类提供的event 和 notify 机制使得任何内部状态的改变都可以触发事件,发布者只需要调用notify 函数。
Handle 基类还提供了另一种方法,addlistener。
该方法用来在发布者处登记观察者,因为一个发布者可以拥有多个事件,所以登记监听者时,还要指定要监听的事件的名称。
为了统一接口,MATLAB创造了新的listener对象,在构造观察者时,只需要提供事件发生的响应函数。如果一个观察者想监听事件,则实际被登记的不是观察者,而是该观察者的响应函数。因此,普通函数也可以在发布者处登记。
方法addlistener用来构造监听者,登记的响应函数可以是普通函数:
%登记的响应函数为普通函数
lh = addlistener (eventObject,'EventName',@functionName)
%登记的响应函数为类的成员方法
lh = addlistener (event,'EventName',@obj.methodName)
%登记的响应函数为类的静态方法
lh = addlistener(eventObkect,'EventName',@CLassName.methodName)
tips:MATLAB固定了第三个参数,即响应函数的接口,规定该函数局部所指向的函数必须至少接受两个输入
第一个参数是发布者对象(src);
第二个参数时事件的数据(eventdata),其本身也是一个对象,可以定义这个对象的类,以定制向监听者传递的数据。
因为listener 对象本身是Handle类对象,所以只要在创建listener时记得保存其Handle,在删除(注销)一个listener时,只需要调用Handle基类提供的delete方法即可。