状态模式就是将状态的条件判断语句转化成其函数重写形式,利用了面向对象语言的多态性,本文根据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();

Matlab状态模式的更多相关文章

  1. StatePattern(状态模式)

    /** * 状态模式 * @author TMAC-J * 状态模式和策略模式很像,其实仔细研究发现完全不一样 * 策略模式各策略之间没有任何关系,独立的 * 状态模式各状态之间接口方法都是一样的 * ...

  2. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

  3. php实现设计模式之 状态模式

    <?php /*状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(行为模式) * * 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做 ...

  4. Java 策略模式和状态模式

    本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...

  5. javascript - 状态模式 - 简化分支判断流程

    状态模式笔记   当一个对象的内部状态发生改变时,会导致行为的改变,这像是改变了对象   状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次 ...

  6. C#设计模式系列:状态模式(State)

    1.状态模式简介 1.1>.定义 状态模式的核心思想是允许一个对象在它的内部状态改变时改变它的行为,即不同的状态对应不同的行为. 状态模式的针对性很强,当有状态变化的时候可以选择状态模式. 1. ...

  7. 十一个行为模式之状态模式(State Pattern)

    定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...

  8. java设计模式之状态模式

    状态模式 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 状态模式UML图 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关 ...

  9. iOS - 在工程中试玩状态模式

    做了一个项目,项目中一个藏品详情界面针对不同用户,和用户所处于的状态的不同,展示的效果和操作的权限都会不同.想到了状态模式,从来没有用过,赶紧学一下然后用一用.期待兴奋 看了这么多的博客,终于找到一个 ...

随机推荐

  1. jsch channel is not opened原因及解决

    潜在原因1:服务器sshd限制,可通过如下解决: 潜在原因2:服务器负载过高,超时.在连接处增加超时时间session.setTimeout(60000);默认情况下,socket的超时时间大约为21 ...

  2. Xamarin.Forms Shell基础教程(1)

    Xamarin.Forms Shell基础教程(1) 什么是Xamarin.Forms Shell Shell是Visual Studio为Xamarin Forms提供的解决方案模版.本质上,She ...

  3. springboot vue前后端分离 跨跨域配置

    public class CustomCorsFilter extends OncePerRequestFilter { @Override protected void doFilterIntern ...

  4. C++ Map运用实例

    C++ Map运用实例 #include <map> #include <string> #include <iostream> #include <ioma ...

  5. (转载)理解Spatial Transformer Networks

    理解Spatial Transformer Networks 转载于:知乎-SIGAI 书的购买链接 书的勘误,优化,源代码资源 获取全文PDF请查看:理解Spatial Transformer Ne ...

  6. IntelliJ IDEA 出现" java: 程序包javax.servlet不存在、 java: 程序包javax.servlet.annotation"等错误

    在IDEA中建立Servlet使用javax.servlet.http.HttpServlet等类时,出现了如下错误: 原因:IntelliJ IDEA 没有导入 servlet-api.jar 这个 ...

  7. 关于Flink slot 和kafka topic 分区关系的说明

    今天又有小伙伴在群里问 slot 和 kafka topic 分区(以下topic,默认为 kafka 的 topic )的关系,大概回答了一下,这里整理一份 首先必须明确的是,Flink Task ...

  8. mysqldump导出完整sql脚本

    #导出某个数据库--结构+数据 shell>mysqldump -h192.168.161.124 -uroot -pxxxxxx --opt db_name |gzip -9 > /db ...

  9. script的src和img的src跨域的区别

    原理上都是利用标签的src可绕过同源限制,跨域请求的特点, 硬要说不同,那么区别在于:img只能单向发送get请求,不可访问响应内容(只是展现),而script可对其进行解析

  10. FLINK-11738

    caused by: akka.pattern.asktimeoutexception: ask timed out on flink Caused by: akka.pattern.AskTimeo ...