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

相关推荐

  • Matlab桥接模式

    桥接模式(Bridge)是一种结构型设计模式.它是用组合关系代替继承关系来实现,可以处理多维度变化的场景(https://blog.csdn.net/qq_31156277/article/detai ...

  • Matlab混入模式(Mixin)

    Mixin是一种类,这种类包含了其他类要使用的特性方法,但不必充当其他类的父类.Matlab无疑是支持多继承的.我们可以利用 Matlab 的这种特性,实现一种叫做 Mixin 的类.MixIn的目的 ...

  • Matlab代理模式

    代理模式(Proxy)就是给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用.代理模式和装饰模式非常类似,但最主要的区别是代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行.本 ...

  • JS的绑定对象this

    this的含义 this表示的是绑定的对象,通常在函数中使用. 不同的代码形式下,绑定的对象代表不同的东西. 下面看一下常见的几种代码形式: 一.独立的函数 function foo() { cons ...

  • ES5 05 Function扩展

    Function.prototype.bind(obj) : 作用: 将函数内的this绑定为obj, 并将函数返回 面试题: 区别bind()与call()和apply()? 都能指定函数中的thi ...

  • 设计模式(二十二)——状态模式(APP抽奖活动+借贷平台源码剖析)

    24.1 APP 抽奖活动问题 请编写程序完成 APP 抽奖活动 具体要求如下: 1) 假如每参加一次这个活动要扣除用户 50 积分,中奖概率是 10% 2) 奖品数量固定,抽完就不能抽奖 3) 活动 ...

  • PHP设计模式之状态模式

    PHP设计模式之状态模式 状态模式从字面上其实并不是很好理解.这里的状态是什么意思呢?保存状态?那不就是备忘录模式了.其实,这里的状态是类的状态,通过改变类的某个状态,让这个类感觉像是换了一个类一样. ...

  • [PHP小课堂]PHP设计模式之状态模式

    [PHP小课堂]PHP设计模式之状态模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 状态模式

    一.状态模式介绍 1.定义与类型 允许一个对象在其内部状态改变时,改变它的行为 类型:行为型 2.适用场景 一个对象存在多个状态(不同状态下行为不同),且状态可相互转换 3.优点 将不同的状态隔离 把 ...

  • 设计模式-行为型-状态模式

    状态模式(State): 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到,然后使用if else语句来做状态判断来进行不同情况的处理 ...

  • 设计模式之状态模式(二)

    在上一次的文章里,我们看到,需求的变更,迫使我们需要重新改造现有的糖果机代码来符合这个新提的需求.但是,也并没有难倒我们,至少我们在文末给出了思路和类图,不知道你想的怎么样了呢. 我们不来虚的,直接进 ...

  • 大话设计模式笔记(十三)の状态模式

    举个栗子 问题描述 上班的日子,上午状态好,中午想睡觉,下午渐恢复,加班苦煎熬.根据时间的不同体现不同的工作状态. 简单实现 Work /** * 工作类 * Created by callmeDev ...

  • 设计模式之策略模式和状态模式(strategy pattern & state pattern)

    本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...