一個簡單的MVC模式的 matlab GUI 面向對象編程範例

主程序

clc
clear 
close all

modelObj = Model(500);
viewObj = View(modelObj);

M(model)類

classdef Model < handle
    properties
        balance
    end
    
    events
        balanceChanged
    end
    
    methods
        function obj = Model(balance)
            obj.balance = balance;
        end
        
        function deposit(obj,val)
            obj.balance = obj.balance + val;
            obj.notify('balanceChanged');
        end
        
        function withdraw(obj,val)
            obj.balance = obj.balance - val;
            obj.notify('balanceChanged');
        end
    end
end

V(view)類

classdef View < handle
    properties
        viewSize;
        hfig;
        drawButton;
        depositButton;
        balanceBox;
        numBox;
        text;
        modelObj;
        controlObj;
    end
    properties(Dependent)
        input;
    end
    methods
        function obj = View(modelObj)
            obj.viewSize = [100,100,300,200];
            obj.modelObj = modelObj;
            obj.modelObj.addlistener('balanceChanged',@obj.updateBalance);
            obj.buildUI();
            obj.controlObj = obj.makeController();
            obj.attachToController(obj.controlObj);
        end
        function input = get.input(obj)
            input = get(obj.numBox,'string');
            input = str2double(input);
        end
        
        function buildUI(obj)
            obj.hfig = figure('pos',obj.viewSize);
            
            obj.drawButton = uicontrol('parent',obj.hfig,'string','withdraw','pos',[60,28,60,28]);
            obj.depositButton = uicontrol('parent',obj.hfig,'string','deposit','pos',[180,28,60,28]);
            
            obj.numBox = uicontrol('parent',obj.hfig,'style','edit','pos',[60,85,180,28],...
                'tag','numBox');
            obj.balanceBox = uicontrol('parent',obj.hfig,'style','edit','pos',[180,142,60,28],...
                'tag','balancebox');
            obj.text = uicontrol('parent',obj.hfig,'style','text','string','balance','pos',[60,142,60,28]);
            
            obj.updateBalance();
        end
        
        function updateBalance(obj,scr,data)
            set(obj.balanceBox,'string',num2str(obj.modelObj.balance));
        end
        
        function controlObj = makeController(obj)
            controlObj = Controller(obj,obj.modelObj);
        end
        
        function attachToController(obj,controller)
            funcH = @controller.callback_drawbutton;
            set(obj.drawButton,'callback',funcH);
            funcH = @controller.callback_depositbutton;
            set(obj.depositButton,'callback',funcH);
        end
    end
end

C(controller)類

classdef Controller < handle
    properties
        viewObj;
        modelObj;
    end
    methods
        function obj = Controller(viewObj,modelObj)
            obj.viewObj = viewObj;
            obj.modelObj = modelObj;
        end
        
        function callback_drawbutton(obj,src,event)
            obj.modelObj.withdraw(obj.viewObj.input);
        end
        function callback_depositbutton(obj,src,event)
            obj.modelObj.deposit(obj.viewObj.input);
        end
    end
end

 

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