Bootstrap

面向对象Matlab编程小demo

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

得到结果



;