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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章