设计模式——State(状态)模式

2023-11-20

前言

考虑一个对象对于不同阶段,不同状态有不同的表现,如tcp连接的监听、建立和关闭。如果使用if else判断来处理将增大复杂度,甚至后续有新状态不利于代码解耦合。而State模式有利于解决这种情况。

1 定义

State(状态)模式:允许一个对象在其状态改变时改变自身行为。

2 适用性

  • 一个对象的行为取决于它的状态,并且是根据它运行时状态改变它的行为。
  • 一个操作有复杂的多分支条件语句,而且判断条件跟对象状态有关。

3 结构

3.1 结构图

State模式结构图如下:
在这里插入图片描述

3.2 参与者

  • Context:环境,定义客户感兴趣的接口,维护一个_state变量,根据状态处理行为。
  • State:状态,描述环境的状态,环境的行为具体是通过该接口的实现处理。
  • ConcreteState:具体状态,环境目前的可能状态,定义具体的处理逻辑和转变情况。

4 应用举例

自定义一个模拟tcp状态转变实例。

4.1 State——TcpState

TcpState定义如下:

/**
 * tcp状态接口
 */
public interface TcpState {
    /**
     * 关闭连接
     */
    void close(TcpConnection tcpConnection);

    /**
     * 建立连接
     */
    void established(TcpConnection tcpConnection);

    /**
     * 监听状态
     */
    void listening(TcpConnection tcpConnection);
}

定义tcp状态的三个操作:监听、建立和关闭。

4.2 Context——TcpConnection

TcpConnection定义如下:

/**
 * tcp模拟类,存储连接信息
 */
@Data
public class TcpConnection {
    private TcpState tcpState;

    public void listen() {
        tcpState.listening(this);
    }

    public void establish() {
        tcpState.established(this);
    }

    public void close() {
        tcpState.close(this);
    }

}

内部维持一个指向当前状态的指针,具体行为均由状态处理。

4.3 ConcreteState——ListeningTcpState、EstablishedTcpState和CloseTcpState

这几个状态转换情况简化为下面图
在这里插入图片描述

4.3.1 ListeningTcpState

定义如下:

/**
 * 监听状态类
 */
public class ListeningTcpState implements TcpState{
    @Override
    public void close(TcpConnection tcpConnection) {
        System.out.println("当前处于监听状态,不能关闭");
    }

    /**
     * 监听状态可以转换为建立状态
     * @param tcpConnection tcp连接信息存储类
     */
    @Override
    public void established(TcpConnection tcpConnection) {
        System.out.println("将进入建立状态");
        tcpConnection.setTcpState(new EstablishedTcpState());
    }

    @Override
    public void listening(TcpConnection tcpConnection) {
        System.out.println("当前处于监听状态");
    }
}

其中该状态下调用建立方法会转变为建立状态。

4.3.2 EstablishedTcpState

定义如下:

/**
 * 建立状态类
 */
public class EstablishedTcpState implements TcpState{
    /**
     * 建立状态可以转换为关闭状态
     * @param tcpConnection tcp状态信息存储类
     */
    @Override
    public void close(TcpConnection tcpConnection) {
        System.out.println("将进入关闭状态");
        tcpConnection.setTcpState(new CloseTcpState());
    }

    @Override
    public void established(TcpConnection tcpConnection) {
        System.out.println("当前处于建立状态");
    }

    @Override
    public void listening(TcpConnection tcpConnection) {
        System.out.println("不能转变为监听状态");
    }
}

该状态下调用关闭方法,会进入关闭状态。

4.3.3 CloseTcpState

定义如下:

/**
 * 关闭连接状态类
 */
public class CloseTcpState implements TcpState{
    @Override
    public void close(TcpConnection tcpConnection) {
        System.out.println("tcp已经连接关闭");
    }

    @Override
    public void established(TcpConnection tcpConnection) {
        System.out.println("当前处于关闭状态,不能建立");
    }

    /**
     * 关闭状态下可以转换为监听状态
     * @param tcpConnection tcp连接信息存储类
     */
    @Override
    public void listening(TcpConnection tcpConnection) {
        System.out.println("将进入监听状态");
        tcpConnection.setTcpState(new ListeningTcpState());
    }
}

该状态下调用监听方法会进入监听状态

4.4 测试

测试demo:
在这里插入图片描述
运行结果
在这里插入图片描述

5 总结

这个结构可能看上去与策略模式相似, 但不同点是——在状态模式中, 特定状态知道其他所有状态的存在, 这样才能实现从一个状态到另一个状态的转换; 策略模式的策略之间一般是相互孤立的。

参考文献

[1]. 《设计模式》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式——State(状态)模式 的相关文章

随机推荐

  • 2、Java 环境搭建

    Java 环境搭建 1 JDK 的简介 JDK Java Development Kit 是一组实现Java程序开发与运行的本地环境 在实际的项目的开发与运行过程之中 往往都会选择一些比较好用的桌面系统 Windows MacOS 进行开发
  • linux下定时器timer_create()的使用

    一 采用新线程派驻的方式 注 编译时 需加上 lrt include
  • Spring IoC依赖注入的实现

    看了 spring技术内幕 的第二章 学习了spring的IoC容器的实现 对其做了浅显地分析 依赖注入的时机 如果配置文件有配置lazy init 那么依赖注入的时机发生在用户向IoC 容器索取bean的时候 即调用beanfactory
  • Django基础2——URL路由系统

    文章目录 一 基本了解 二 url路由分发 三 正则匹配 四 压缩归档超链接 优化一 使用分组名称功能 优化二 使用url名称功能 4 1 使用功能之前效果展示 4 2 使用功能之后效果展示 一 基本了解 概念 路由系统就是URL路径和视图
  • 字符串匹配算法总结

    转自 http blog csdn net zdl1016 archive 2009 10 11 4654061 aspx 我想说一句 我日 我讨厌KMP KMP虽然经典 但是理解起来极其复杂 好不容易理解好了 便起码来巨麻烦 老子就是今天
  • 面向对象设计 简述

    面向对象设计 面向对象的特性 将数据封装于类中 完全面型对象 封装 隐藏细节 只给出使用信息 公共的访问方式 隐藏对象的属性和实现细节 继承 继承就是子类继承父类的特征和行为 使得子类对象 实例 具有父类的实例域和方法 或子类从父类继承方法
  • nodeJs(express)文件上传配置

    用node作为服务器端 在需要上传文件到后台时 后台需要相应配置 简单配置如下 1 安装multer依赖 npm install multer save 渣渣前台的渣渣后台技术有限 不是自己配置的node服务器 使用的是webstorm自带
  • Android客户端apk自动检测更新自动下载自动安装的实现方法

    改进了一个可以检测版本更新自动下载自动安装的客户端升级方案 在下载之前删除之前的历史下载文件 减少垃圾数据 先给出核心类 public class DownloadService extends Service private Downlo
  • airpodspro没有弹窗_安卓党能用 AirPods Pro ?这样操作可以完美适配

    AirPods Pro一出现就引爆了市场 高达2000元的售价没能阻拦人们对它的狂热 目前AirPods已经在官网全面缺货 发货等待期甚至多达一个月 这是因为AirPods Pro的产品力实在太过出色 比它降噪强的没它小 比它小的没它降噪
  • C# A potentially dangerous 问题解决

    A potentially dangerous Request Path value was detected from the client 如果在页面中出现上述错误 只需在页面的头文件添加validateRequest false 即可
  • 【Vue基础】Vuex全局管理的基本代码结构及其使用

    Vuex全局管理的基本代码结构及其使用 一 代码结构及其使用 1 state 提供唯一的公共数据源 组件访问 state 中数据的第一种方式 this store state 全局数据名称 组件访问 state 中数据的第二种方式 mapS
  • UE4 使蓝图连接线出现小箭头标志

    当我们写的蓝图杂乱无章 甚至不能看清执行顺序的时候 只需要在偏好设置里设置一下就可以清晰的看清蓝图的执行顺序
  • 区块链+物联网 BOT

    不可否认 我们的一只脚已经迈入万物智联时代 但另一只脚迈入还存在一定的阻碍 区块链技术的出现将会促进这一进程的发展 智能音响 主人你好 我是小Q 现在是早上08点29分 上班时间要到咯 智能门锁 主人你摔疼我了 你总是这样匆忙 下次赶紧麻溜
  • 安装Python第三方库

    视频版教程 Python3零基础7天入门实战视频教程 在Python的标准安装中 包含了一组自带的模块 这些模块被成为 标准库 比如常用的math random datetime os json等等 此外 还有很多的第三方模块 或者叫做库也
  • 若以框架 vue富文本字符串中获取图片的存储路径

    若依的富文本 字符串是上述格式 我们要获取以下格式 就是图片的存储路径 有几个步骤 第一步 main js中添加两行代码 import axios from axios Vue prototype axios axios 第二步 Edit包
  • Python 笔记 — 单例模式和魔术方法

    目录 一 单例模式 1 概念 2 优点 3 使用 4 实现方法 5 运用 6 内存地址 7 通过 new 实现 8 通过 classmethod 9 通过装饰器实现 10 通过导入模块时实现 11 hasattr 函数 12 getattr
  • 内存管理——分页分段

    一 分页存储管理 1 页面与页框 1 页面 将一个进程的逻辑地址空间分成若干个大小相等的片 称为页面或页 并为各页加以编号 2 页框 相应于页面 把内存空间分成和页面相同大小的若干个存储块 称为 物理 块或页框 frame 3 页内碎片 在
  • Android中项目中各个文件夹的含义和用途详解

    1 src 存放所有的 java源程序 2 gen 为ADT插件自动生成的代码文件保存路径 里面的R java将保存所有的资源ID 3 assets 可以存放项目一些较大的资源文件 例如 图片 音乐 字体等 4 res 可以存放项目中所有的
  • IntelliJ IDEA 2022.3 版本 IDAE 的Java 编译器错误问题解决方法

    2022 2 3 版本 IDAE 的Java 编译器错误问题解决方法 如果这是按照以前的办法就是去更改下面 的内容就可以OK了 但是在最新版中无论怎么修改都是无用 不知道为啥 随后我就在这里 是的就是上面 的第二张图中 将11 versio
  • 设计模式——State(状态)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 应用举例 4 1 State TcpState 4 2 Context TcpConnection 4 3 ConcreteState ListeningTcp