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