事件(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())