无需关注,查看原文
事件(Event)是对象内部的状态改变,事件的发生往往会有一定的相应。改变对象内部状态的叫做发布者,做出相应响应的是观察者。这里需要用到两个函数分别为 addlistener和notify,用于添加监听器和发布事件。
- 发布事件,不传递信息
看下面的定义:
% DataSource.m
classdef DataSource < handle % 发布者
properties
msg1
end
events % 定义一个事件
sendmsg
end
methods
function reaction(obj,scr,data) % 普通类方法
disp('reaction notified.')
end
function showtime(obj,scr,data)
disp(['当前时间' data.ts])
end
end
methods(Static)
function staticFcn(scr,data) % 类的静态函数
disp('staticFcn notified.')
end
end
end
这里我们测试三个响应函数,分别为普通函数,普通类方法,类的静态函数。
除了静态函数以外其他的函数都要三个参数,分别为obj,scr,data,这是因为静态函数并不属于某一个对象。
% 只发布信息,不传递参数
a = DataSource;
a.addlistener('sendmsg',@a.reaction);
% a.addlistener('sendmsg',@ordinaryFcn);
a.addlistener('sendmsg',@DataSource.staticFcn);
a.notify('sendmsg') % 表示 ‘sendmsg’这个事件发生了
在创建一个对象之后,然后给a添加监听器,第一个参数是对应的事件,第二个参数是响应的函数,第三个参数是传递的信息,这里没有。
在sendmsg发生之后,就会依次调用响应函数。
如果说要传递信息,data需要是一个对象,并且是event.EventData的子类。比如说我们需要知道事件发生时的时间,我们可以使用一个时间戳 timeStamp对象,其定义如下:
% timeStamp.m
classdef timeStamp < event.EventData
properties
ts
end
methods
function obj = timeStamp()
tempTime = clock; % 返回当前的时间,年月日等
obj.ts = [ '(' num2str(tempTime(4),'%02.0f') ':'...
num2str(tempTime(5),'%02.0f') ':'...
num2str(tempTime(6),'%02.0f') ')' ];
end
end
end
那么传递信息的方式如下:
% 传递信息
a.addlistener('sendmsg',@a.showtime);
a.notify('sendmsg',timeStamp())