1.前言
matlab初学者,在编写matlab代码时,感觉代码比较乱,不好写也不易看,突然想到是否可以使用面向对象的思想去编写matlab程序,在网上找了找,果然有一本专门讲解面向对象的matlab书,并且作者还讲解了设计模式,很不错。自己也尽量的使用之前编写Java程序的方式去写,简单地写一个demo程序,以方便自己以后查看。
参考书籍:《MATLAB面向对象编程---从入门到设计模式》作者 徐潇,李远。感谢两位作者
操作系统:win7
matlab版本:R2010b
2.步骤
这个简单的demo的功能是每隔一段时间,向两个观察者发送消息,接收者收到消息后打印消息
(1)建立一个文件夹叫demo,打开它,再逐步建立文件夹"+cn" --> "+jxm" --> "+demo",类似于Java中的包一样,注意在matlab中的包名前要加"+"
(2)点击"+demo"文件,右键-->“New File”-->"Class"建立Publisher类
classdef Publisher < handle
events
MyEvent1;%定义事件1
MyEvent2;%定义事件2
end
properties
deltaTime;%间隔时间,单位为毫秒
myTimer;%Timer
count = 0;%计数,5次后关闭timer
end
methods
%构造函数
function obj = Publisher(deltaTime)
obj.deltaTime = deltaTime;
%timer
obj.myTimer = timer('TimerFcn',@obj.timerFunction,'Period',obj.deltaTime/1000,'ExecutionMode','fixedrate');
end
%启动timer函数
function start(obj)
start(obj.myTimer);
end
%停止timer函数
function stop(obj)
ts=timerfind;
if (~isempty(ts))
stop(ts);
delete(ts);
end
end
%timer响应函数
function timerFunction(obj,timer,event)
%通知观察者1
obj.notify('MyEvent1');
%通知观察者2,传递消息"Hello Observer!"
msg = cn.jxm.demo.Msg('Hello Observer!');
obj.notify('MyEvent2',msg);
obj.count = obj.count + 1;
if(obj.count == 5)
obj.stop();
end
end
end
end
(2)同样方法建立Msg类,注意该类的父类
classdef Msg < event.EventData
properties
str;
end
methods
function obj = Msg(str)
obj.str = str;
end
end
end
(3)建立Observer1类
classdef Observer1 < handle
properties
str = 'I am Observer1, response to MyEvent1';
end
methods
%添加消息发布者
function addPublisher(obj,publisher)
publisher.addlistener('MyEvent1',@obj.listenerFunction);
end
%收到消息后的响应
function listenerFunction(obj,src,data)
disp(obj.str);
end
end
end
(4)建立Observer2类
classdef Observer2 < handle
properties
str = 'I am Observer2, response to MyEvent2.The msg is: ';
end
methods
%添加消息发布者
function addPublisher(obj,publisher)
publisher.addlistener('MyEvent2',@obj.listenerFunction);
end
%收到消息后的响应
function listenerFunction(obj,src,data)
disp([obj.str,data.str]);
end
end
end
(5)建立测试类Test
classdef Test
properties
end
methods(Static)
function main()
publsher = cn.jxm.demo.Publisher(1000);
observer1 = cn.jxm.demo.Observer1();
observer1.addPublisher(publsher);
observer2 = cn.jxm.demo.Observer2();
observer2.addPublisher(publsher);
publsher.start();
end
end
end
3.测试
在matlab中输入:
import cn.jxm.demo.Test
Test.main()
得到结果