MATLAB 面向对象编程(八)监听器listener

无需关注,查看原文
事件(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()) 

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肆拾伍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值