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 - 在工程中试玩状态模式
做了一个项目,项目中一个藏品详情界面针对不同用户,和用户所处于的状态的不同,展示的效果和操作的权限都会不同.想到了状态模式,从来没有用过,赶紧学一下然后用一用.期待兴奋 看了这么多的博客,终于找到一个 ...
随机推荐
- uniapp - emmet
话说,emment是官方uniapp直接引入的.基本上没做啥修改:可以点这里查看所有用法 - http://emmet.evget.com/ 1.类似css层级写法 1.1 view.ok>vi ...
- 使用ssh-keygen生成私钥和公钥
1.使用ssh-keygen生成私钥和公钥 命令如下: ssh-keygen -t rsassh-keygen -t rsa -C "用户名自取"可以是邮箱 例子: fdipzon ...
- unable to access android sdk add-on list的解决
第一次安装android studio时候弹出unable to access android sdk add-on list原因是你电脑没有SDK而且你下载的android studio又是不带SD ...
- pandas连接多个表格concat()函数
网易云课堂该课程链接地址 https://study.163.com/course/courseMain.htm?share=2&shareId=400000000398149&cou ...
- 关于在windows平台下将应用制作成windows服务及服务依赖的感想
在某些情况下,应用需要部署在windows平台下,单纯的手动点击exe执行文件或java -jar xxx.jar在实际生产环境中不是最佳实践(制作成bat启动文件置于启动项里,服务器启动后,需要人工 ...
- 华硕主板 Vmware虚拟机 二进制转换与此平台上的长模式不兼容
出现情况如下: 大概遇到过两次这个问题,第一次是在笔记本VM上装虚拟机,第二次是在台式机VM上装虚拟机. 原因是因为虚拟化(Intel Virtualization Technology)技术,在主板 ...
- javafx这些学会后,开发就不难了,往tablecloumn列中添加按钮,修改javafx中tableview中tablecell中的值,修改完回车表示保存到内存中
javafx开发过程中遇见难题,往tablecloumn列中添加按钮 想了很久的方法,也配有办法判断每行中有数据的地方添加按钮set bank_caozuo.setCellFactory((col)- ...
- ETF:现金替代标志
替代标志.表示该成份证券是否可被现金替代 0 – 沪市不可被替代 1 – 沪市可以被替代 2 – 沪市必须被替代 3 – 深市退补现金替代 4 – 深市必须现金替代 5 – 非沪深市场成分证券退补现金 ...
- rtmp_specification_1.0
Copyright Adobe Systems Incorporated H. Parmar, Ed. M. Thornburgh, Ed. Adobe December 21, 2012 Adobe ...
- LinkedHashMap原理
作者:艺旭家 链接:https://www.jianshu.com/p/8f4f58b4b8ab 总结 LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的. Ha ...