首页 > 其他分享 >状态模式

状态模式

时间:2023-04-16 15:00:13浏览次数:59  
标签:状态 处理 void 模式 连接 state public

概述

《设计模式》一书中对于 “状态模式” 的描述如下:

允许一个对象在其内部状态发生改变时改变它的行为,使得这个对象看起来像修改了它的类

状态模式的 UML 图如下所示:

state_pattern_uml.png

一般在以下几种情况下使用状态模式:

  • 一个对象的行为取决于它的状态
  • 一个操作中含有庞大的多分支条件语句,且这些分支依赖于该对象的状态

具体示例

一个比较经典的示例就是有关于 TCP 连接的处理,对于一个 TCP 连接来讲,在不同的连接状态下,需要进行的处理是不同的。比如,如果是未建立连接的状态下需要发送数据,那么首先需要建立连接;如果在已经建立连接的前提条件下,那么只需要直接发送数据即可,这种情况的处理就很适合使用状态模式进行处理

首先,定义所有不同状态下进行处理的抽象类 TCPState

public abstract class TCPState {
    public abstract void openConnection();
    public abstract void sendMsg();
    public abstract void close();
}

之后,对于 TCPConnection 连接对象来讲,需要将对应的处理委托给实际的状态进行处理:

public class TCPConnection {
    private TCPState state;
    
    public void changeState(TCPState state) {
        this.state = state;
    }
    
    public void openConnection() {
        this.state.openConnection();
    }
    
    public void sendMsg() {
        this.state.sendMsg();
    }
    
    public void close() {
        this.state.close();
    }
}

对于不同的连接状态,需要执行不同的处理:

public class EmptyState extends TCPState { // 未建立连接时的有关处理
    @Override
    public void openConnection() {
        createConnection(); // 实际创建连接的过程
    }
    
    @Override
    public void sendMsg() {
        throw new IllegalStateException("当前未创建对应的 TCP 连接");
    }
    
    @Override
    public void close() {
        throw new IllegalStateException("当前未创建对应的 TCP 连接");
    }
}

public class EstablishState extends TCPState { // 已经建立连接时的有关处理
    @Override
    public void openConnection() {
        throw new IllegalStateException("不能重复打开已有的连接");
    }
    
    @Override
    public void sendMsg() {
        sendMessage(); // 发送数据的具体处理
    }
    
    @Override
    public void close() {
        closeConnection(); // 具体的关闭连接处理
    }
}

而对于 TCPConnection 对象来讲,现在只需要再维护一个对应的状态机,来处理状态之间的转换即可:

public class Application {
    public static void main(String[] args) {
        TCPConnection conn = new TCPConnection();
        conn.changeState(new EmptyState());
        conn.openConnection();
        // 创建连接结束
        
        conn.changeState(new EstablishState());
        conn.sendMsg("Hello World!");
        conn.close();
    }
}

总结

通过状态模式,可以简化一些冗余的判断处理,加强代码的结构性以及降低对象之间的耦合关系。在涉及到状态之间的转换时,可以通过预先定义对应的状态机来确定每一次操作后的所属状态,从而加强对象的复用


参考:

[1] 《设计模式—可复用面向对象基础》

标签:状态,处理,void,模式,连接,state,public
From: https://www.cnblogs.com/FatalFlower/p/17323296.html

相关文章

  • KubeSphere 社区双周报 | OpenFunction 支持 Dapr 状态管理 | 2023.03.31-04.13
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.03.31-2023.04.13。贡献者名单新晋KubeSphereCon......
  • 《3D编程模式》写书-第3次记录
    大家好,这段时间我完成了“积木模式”、“管道模式”、“多线程模式”、“依赖隔离模式”的初稿目前我已经完成了所有模式(7个模式)的初稿,下面会给出它们的使用场景,如果您正好能用到,请联系我提前阅读模式的初稿,欢迎大家给出反馈建议,您的大名有机会出现在《3D编程模式》的书中,感谢!我......
  • CytoTRACE推测细胞分化状态
    <生信交流与合作请关注公众~号@生信探索>python环境CytoTRACE的iCytoTRACE函数需要调用python去除批次效应,因此需要先设置好python环境mambacreate-nSC&&mambaactivateSCmambainstall-y-cconda-forgepython=3.10notebookipywidgetspandasnumpyseabornmatpl......
  • [Mellanox] 安装MFT并配置网卡为以太网模式
    [Mellanox]安装MFT并配置网卡为以太网模式当我们想要配置Mellanox网卡时,如果出现了下面情况:$sudomststartmst:commandnotfound这说明我们的系统中缺少MFT。MFT是一套管理Mellanox网卡的工具,也是MLEX_OFED中的一部分。如果你不小心搞丢了MFT,可以用下面的方法安装:去......
  • 项目中的观察者模式
    背景目前开发的项目中,出现过许多次观察者模式,且其和普通的观察者模式有些许不同,为了理解而进行整理。项目中的观察者模式类图:流程:脚本订阅消息队列消息,创建Subject,传送解析后的消息给所有观察者,观察者根据消息类型判断是不是自己关心的消息,是的话就把自己注册到Subject中;Subj......
  • FTP数据连接既可能是客户端发起的,也可能是服务器端发起的 主动传输模式和被动传输模式
    主动传输模式和被动传输模式在FTP协议中,控制连接使用周知端口21。相反,数据传输连接的目的端口通常实现无法知道。FTP协议使用一个标准的端口21作为ftp-data端口,但是这个端口只用于连接的源地址是服务器端的情况,在这个端口上根本就没有监听进程。FTP的数据连接和控制连接的方向一般......
  • OSG 使用整理(2):设置渲染状态
    二、场景管理2.1遍历场景图场景图遍历类型有以下几种:(1)    事件遍历:在遍历节点时,处理鼠标和键盘输入。(2)    更新遍历:用于修改场景图,添加节点,设置节点属性,执行回调。(3)    裁剪遍历:根据节点是否位于一个视口内来筛选节点,裁剪掉不可见和不可用的......
  • Spring03_代理模式
    一、静态代理(一)代理模式概述​ 在不改变原始类(或叫被代理类)的情况下,通过引入代理类来给原始类附加功能。一般情况下,我们让代理类和原始类实现同样的接口。但是,如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的。在这种情况下,我们可以通过让代理类继承原始类的方法......
  • 【锂电池健康状态预测】基于布谷鸟算法优化BP神经网络实现锂电池健康状态预测附含Matl
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 03装饰者模式
    例子星巴兹是以扩张速度最快而闻名的咖啡连锁店。因为扩张速度实在太快,他们着急更新订单系统,来匹配他们的饮料供应要求。实现1---继承购买咖啡时,也可以要求其中加入各种调料,例如:蒸奶,豆浆很明显,星巴兹为自己制造了一个维护噩梦,如果牛奶的价钱上扬,怎么办?新增一种焦糖调料风味......