状态模式就是将状态的条件判断语句转化成其函数重写形式,利用了面向对象语言的多态性,本文根据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. WebRTC搭建前端视频聊天室——信令篇

    这篇文章讲述了WebRTC中所涉及的信令交换以及聊天室中的信令交换,主要内容来自WebRTC in the real world: STUN, TURN and signaling,我在这里提取出的一 ...

  2. [原]globalmapper设置高程配色(globalmapper自定义配色方案)

    1.使用的globalmapper版本:1.8以上(之前的版本也应该支持) 2.将全球DEM加载进去 (零时找的小DEM  全球7级) 3.右击此处,选择“高程图例选项” 4.选择 配置-着色器选项 ...

  3. Qt编写项目作品大全(自定义控件+输入法+大屏电子看板+视频监控+楼宇对讲+气体安全等)

    一.自定义控件大全 (一).控件介绍 超过160个精美控件,涵盖了各种仪表盘.进度条.进度球.指南针.曲线图.标尺.温度计.导航条.导航栏,flatui.高亮按钮.滑动选择器.农历等.远超qwt集成的 ...

  4. python中的绝对导入与相对导入,from __future__ import absolute_import的区别

    相对导入:在不指明 package 名的情况下导入自己这个 package 的模块,比如一个 package 下有 a.py 和 b.py 两个文件,在 a.py 里 from . import b ...

  5. linux 打印机管理输出等命令

    lp 打印文件, 对于打印文件的命令,伯克利实现版本是 lpr,而 System V 实现版本是 lplpadmin 打印机管理,添加.删除等打印机lpstat 查看打印机状态lpq 检查打印队列lp ...

  6. Java分布式:分布式锁之Zookeeper

    Java分布式:分布式锁之Zookeeper 分布式锁系列教程重点分享锁实现原理 引入ZooKeeper ZooKeeper是什么呢? ZooKeeper 是一个开源的分布式协调服务,它可以在分布式系 ...

  7. web端测试总结

    1.数值型输入框: 条件:demcial(x,y) ,界面显示小数点到y位 通常要检查以下几点: (1)边界值:最大值.最小值.最大值+1.最小值-1  (2)位数:最小位数.最大位数.最小位数-1最 ...

  8. 【Docker学习之三】Docker查找拉取镜像、启动容器、容器使用

    环境 docker-ce-19.03.1-3.el7.x86_64 CentOS 7 一.查找.拉取镜像.启动容器1.查找镜像-docker search默认查找Docker Hub上的镜像,举例:D ...

  9. Datalogic 雕刻机

    选型需要考虑: 1. 材料 2. 材质 3. 内容 4. 范围 选择镜头 5. 厚度 6. 效率 7. 效果 脚本代码: // COM 串口设置 const N_COM = "COM2&qu ...

  10. 单点登录(SSO)解决方案介绍

    一.单点登录的介绍 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用 ...