状态模式就是将状态的条件判断语句转化成其函数重写形式,利用了面向对象语言的多态性,本文根据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. xmind 8 update8(pro)最新版专业版破解教程(附破解补丁以及注册机,全网独家可用)

    title: "xmind 8 update8(pro)最新版专业版破解教程(附破解补丁以及注册机,全网独家可用)" categories: soft tags: soft aut ...

  2. C++ 函数模板print

    简述 在知乎看到文章leetcode 的奇怪 println vector 工具,于是手痒自己也写了一个print函数. 因为工作中没有需要写这种代码的情况,所以好久没有写这种代码了,还是挺怀念以前学 ...

  3. android studio 创建项目的一些配置

    build.gradle文件 apply plugin: 'com.android.application' apply plugin: 'org.greenrobot.greendao' // 使用 ...

  4. tp的增删改查的结果判断?

    参考: https://blog.csdn.net/qq_27930635/article/details/78853908 总之, 要用 全等 来判断, = = = 注意, 不要再用 mysql_a ...

  5. springMVC:为MultipartFilte配置了上传文件解析器,报错或不能使用

    一.问题描述为支持restful风格请求,并且应对可能上传文件的情况,需要在配置hiddenHttpMethodFilter过滤器之前配置MultipartFilter.目的是让MultipartFi ...

  6. java base64编码解码

    第一种.DatatypeConverter 使用JDK自带DatatypeConverter.java类实现,JDK版本必须>=1.6 /** * @Description base64编码 * ...

  7. IfcRoot

    IfcRoot is the most abstract and root class for all entity definitions that roots in the kernel or i ...

  8. 【jmeter】使用csv文件生成用户名和密码列表

    介绍 在[jmeter]使用jmeter进行测试-示例 中介绍了jmeter的基本使用,本文将介绍如何使用csv文件生成多个用户名. 应用场景 实际测试中,经常需要模拟多个用户进行负载测试,而用户名和 ...

  9. SDN实验---Ryu的应用开发(四)基于跳数的最短路径转发原理

    一:实现最短跳数转发 (一)原理 推文:迪杰斯特拉算法和弗洛伊德算法 二:代码实现 (一)全部代码 from ryu.base import app_manager from ryu.controll ...

  10. Qt编写安防视频监控系统16-设备播放

    一.前言 设备播放模块是后面增加的,核心就是通过组合rtsp视频流地址来播放实时视频和历史视频,目前市面上很多厂家比如排第一的海康都是支持直接rtsp通过NVR来播放某个通道视频流和回放某个通道的视频 ...