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();
Matlab状态模式的更多相关文章
- StatePattern(状态模式)
/** * 状态模式 * @author TMAC-J * 状态模式和策略模式很像,其实仔细研究发现完全不一样 * 策略模式各策略之间没有任何关系,独立的 * 状态模式各状态之间接口方法都是一样的 * ...
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...
- php实现设计模式之 状态模式
<?php /*状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(行为模式) * * 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做 ...
- Java 策略模式和状态模式
本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...
- javascript - 状态模式 - 简化分支判断流程
状态模式笔记 当一个对象的内部状态发生改变时,会导致行为的改变,这像是改变了对象 状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次 ...
- C#设计模式系列:状态模式(State)
1.状态模式简介 1.1>.定义 状态模式的核心思想是允许一个对象在它的内部状态改变时改变它的行为,即不同的状态对应不同的行为. 状态模式的针对性很强,当有状态变化的时候可以选择状态模式. 1. ...
- 十一个行为模式之状态模式(State Pattern)
定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...
- java设计模式之状态模式
状态模式 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 状态模式UML图 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关 ...
- iOS - 在工程中试玩状态模式
做了一个项目,项目中一个藏品详情界面针对不同用户,和用户所处于的状态的不同,展示的效果和操作的权限都会不同.想到了状态模式,从来没有用过,赶紧学一下然后用一用.期待兴奋 看了这么多的博客,终于找到一个 ...
随机推荐
- Java基础 awt Font 四种字体样式
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- linux tomcat 文件切割
修改bin目录下catalina.sh if [ -z "$CATALINA_OUT" ] ; then CATALINA_OUT="$CATALINA_BASE&quo ...
- 【转载】 TensorFlow学习——tf.GPUOptions和tf.ConfigProto用法解析
原文地址: https://blog.csdn.net/c20081052/article/details/82345454 ------------------------------------- ...
- BigDecimal 基本使用 比较大小和加减乘除
//比较大小: int a = bigdemical.compareTo(bigdemical2) //a = -1,表示bigdemical小于bigdemical2: //a = 0,表示bigd ...
- 升级到11.2.0.4后用srvctl无法启用数据库实例,报CRS-0254: authorization failure
在standby database上从11.2.0.3升级11.2.0.4,然后打了补丁PATCH SET UPDATE 11.2.0.4.190115后,无法用srvctl启动第二个节点数据库实例: ...
- 转 mysql distinct函数 与 免密码登录 与 查看表的结构
#########sample 1 mysql中去重 distinct 用法 在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重 ...
- Prometheus监控教程——从入门到放弃
Prometheus的安装还是比较简单的 下载地址如下 https://prometheus.io/download/ 解压,修改配置,运行.默认监听9090端口 [root@localhost ~] ...
- 本地win下JConsole监控远程linux下的JVM
环境:服务器端: Linux + jdk1.7.0_75 + tomcat 7本地: Win + jdk1.7.0_55 一.修改/etc/hosts文件 hostname -i 如果显示127.0. ...
- Datalogic 雕刻机
选型需要考虑: 1. 材料 2. 材质 3. 内容 4. 范围 选择镜头 5. 厚度 6. 效率 7. 效果 脚本代码: // COM 串口设置 const N_COM = "COM2&qu ...
- electron+vue实现菜单栏
公司开发的产品都是用c++写的,而且还都是几个人,老板想搞下创新,就是看看能否通过其它的方式来实现前后端分离.然后我就了解到了electron这个东西,之前学安卓的时候看到过flutter,不经意间看 ...