Matlab状态模式

状态模式就是将状态的条件判断语句转化成其函数重写形式,利用了面向对象语言的多态性,本文根据https://blog.csdn.net/lm324114/article/details/78819602的情景将状态模式用Matlab语言实现。

 

 

根据上图情景,用传统的方法实现如下:

RoomState.m

classdef RoomState < handle
    enumeration
        FREE 
        BOOKED 
        CHECKIN 
    end
end   

IfRoom.m

classdef IfRoom < handle
    properties
        state;
    end
    methods
        function obj = IfRoom()
            obj.state = RoomState.FREE;
        end
        function bookRoom(obj)
            switch obj.state
                case RoomState.FREE
                    disp('完成预订...');
                    obj.state = RoomState.BOOKED;
                case RoomState.BOOKED
                    disp('该房间已经被预订了...');
                case RoomState.CHECKIN
                    disp('该房间已经有人入住了...');
            end
        end
        function checkInRoom(obj)
            switch obj.state
                case RoomState.FREE
                    disp('空闲房间,入住..');
                    obj.state = RoomState.CHECKIN;
                case RoomState.BOOKED
                    disp('入住房间....');
                    obj.state = RoomState.CHECKIN;
                case RoomState.CHECKIN
                    disp('该房间已经有人入住了...');
            end
        end
        function unsubscribeRoom(obj)
            switch obj.state
                case RoomState.FREE
                    disp('该房间尚未预订');
                case RoomState.BOOKED
                    disp('已退订房间...');
                    obj.state = RoomState.FREE;
                case RoomState.CHECKIN
                    disp('该房间已入住,不能退订');
            end
        end
        function checkOutRoom(obj)
            switch obj.state
                case {RoomState.FREE, RoomState.BOOKED}
                    disp('该房间尚未入住');
                case RoomState.CHECKIN
                    disp('已退房');
                    obj.state = RoomState.FREE;
            end
        end
    end
end

测试代码:

ri = IfRoom();
ri.bookRoom();
ri.checkOutRoom();
ri.unsubscribeRoom();
ri.checkInRoom();
ri.checkOutRoom();

用状态模式实现如下:

State.m

classdef State < handle    
    properties
        state;
    end
    methods(Abstract)     
        bookRoom(obj);     
        checkInRoom(obj)     
        unsubscribeRoom(obj)      
        checkOutRoom(obj)       
    end
end   

FreeState.m

classdef FreeState < State
     properties
        room
    end    
    methods
        function obj = FreeState(room)
            obj.room = room;
        end
        function bookRoom(obj)
              disp('完成预订...');
              obj.room.state = obj.room.BOOKED_STATE;
        end
        function checkInRoom(obj)
             disp('空闲房间,入住..');
             obj.room.state = obj.room.CHECKIN_STATE;
        end
        function unsubscribeRoom(~)
            disp('该房间尚未预订');                  
        end
        function checkOutRoom(~)         
              disp('该房间尚未入住');
        end
    end
end

BookedState.m

classdef BookedState < State
    properties
        room
    end    
    methods
        function obj = BookedState(room)
            obj.room = room;
        end
        function bookRoom(~)           
             disp('该房间已经被预订了...');
        end
        function checkInRoom(obj)
              disp('入住房间....');
              obj.room.state = obj.room.CHECKIN_STATE;
        end
        function unsubscribeRoom(obj)
            disp('已退订房间...');
            obj.room.state = obj.room.FREE_STATE;                  
        end
        function checkOutRoom(~)         
              disp('该房间尚未入住');
        end
    end
end

CheckInState.m

classdef CheckInState < State
     properties
        room
    end    
    methods
        function obj = CheckInState(room)
            obj.room = room;
        end
        function bookRoom(~)
              disp('该房间已经有人入住了...');
             
        end
        function checkInRoom(~)
             disp('该房间已经有人入住了...');
        end
        function unsubscribeRoom(~)
            disp('该房间已入住,不能退订');                  
        end
        function checkOutRoom(obj)         
              disp('已退房');
              obj.room.state = obj.room.FREE_STATE;
        end
    end
end

Room.m

classdef Room < handle
    properties
        FREE_STATE;
        BOOKED_STATE;
        CHECKIN_STATE;
    end
    
    properties
        state;
    end
    
    methods
        function obj = Room()
            obj.FREE_STATE = FreeState(obj);
            obj.BOOKED_STATE = BookedState(obj);
            obj.CHECKIN_STATE = CheckInState(obj);
            obj.state = obj.FREE_STATE;
        end
        function bookRoom(obj)
            obj.state.bookRoom();
        end
        function checkInRoom(obj)
             obj.state.checkInRoom();
        end
        function unsubscribeRoom(obj)
            obj.state.unsubscribeRoom();                
        end
        function checkOutRoom(obj)         
              obj.state.checkOutRoom();
        end
    end
end

测试代码

r = Room();
r.bookRoom();
r.checkOutRoom();
r.unsubscribeRoom();
r.checkInRoom();
r.checkOutRoom();

posted on 2019-05-14 16:58  sw-lab  阅读(447)  评论(0编辑  收藏  举报

导航