状态模式(State)

2023-10-27

1、概念

状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类,属于行为型模式。
在这里插入图片描述

2、模式结构

  • 环境角色(Context):定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
  • 抽象状态角色(State):定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
  • 具体状态角色(ConcreteState):每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

3、使用场景

  • 对象的行为依赖于它的某些属性值,状态的改变将导致行为的变化
  • 在代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,并且导致客户类与类库之间的耦合增强

4、优缺点

优点:

  • 封装了转换规则
  • 枚举可能的状态,在枚举状态之前需要确定状态种类
  • 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为
  • 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块
  • 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数

缺点:

  • 增加系统类和对象的个数
  • 结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱
  • 对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码

5、实例

定义抽象状态角色ConnectState

public interface ConnectState {
    void handleAction();
}

定义具体状态角色ReconnectState

public class ReconnectState implements ConnectState {

    @Override
    public void handleAction() {
        // 重连逻辑
    }
}

定义具体状态角色SuccessState

public class SuccessState implements ConnectState {

    @Override
    public void handleAction() {
        // 成功逻辑
    }
}

定义具体状态角色FailureState

public class FailureState implements ConnectState {

    @Override
    public void handleAction() {
        // 失败逻辑
    }
}

定义环境角色Context

public class Context {
    private ReconnectState reconnectState;
    private FailureState failureState;
    private SuccessState successState;

    public void reconnect() {
        if (reconnectState == null) {
            reconnectState = new ReconnectState();
        }
        reconnectState.handleAction();
    }

    public void failure() {
        if (failureState == null) {
            failureState = new FailureState();
        }
        failureState.handleAction();
    }

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

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

  • python编程:numpy包

    numpy是使用Python进行科学计算的基本软件包 它包含以下内容 强大的N维数组对象 复杂的 广播 功能 集成C C 和Fortran代码的工具 有用的线性代数 傅立叶变换和随机数功能 我们先比较一下numpy和list的运算速度 比如

随机推荐

  • matlab图像处理系列:图片圈数识别+编号标记位置

    matlab图像处理系列 图片圈数识别 编号标记位置 一 app界面介绍 二 实现过程 step1图像二值化 step2 图像close 做差 step3 像素阈值处理 step4 清除小区域 step5 识别联通区域 并在原图上标记 三
  • 3D空间包围球(Bounding Sphere)的求法

    引言 在3D碰撞检测中 为了加快碰撞检测的效率 减少不必要的碰撞检测 会使用基本几何体作为物体的包围体 Bounding Volume BV 进行测试 基本包围体的碰撞检测相对来说便宜也容易的多 所以如果在基本包围体的碰撞检测中都没有通过的
  • Docker Registry深度历险

    目录 前言 环境 问题缘起 安装本地Registry minikube访问共享image 前言 上篇我们对Docker整体有了一定了解 知道了其中一个核心概念是Registry 下来就进行更深入的学习 环境 环境 mac mini M1芯片
  • JNA传入char[][]和具有联合体结构对象数组

    工作中根据施工现场需要 我们需要通过API接口获取对方系统内数据 但是API接口方法参数如下 DWORD getSnapshot DBPH h char Names 80 TVVAL tvs int size 其中包含了char的双重数组
  • C ++的单例模式

    单例模式 对应一个类只能生成一个对象 include
  • python列表中获取最长的字符串

    从列表中找出最长的字符串 有两种方式 一种用for循环比较 另一种是python的max方法 使用的txt文件格式 方法一 使用for循环代码 def get longest name school max length 0 longest
  • linux下使用gettimeofday函数获取程序执行时间

    一 介绍 linux下为了获取某个程序的执行时间 我们通常使用gettimeofday 函数 此函数声明在sys time h文件中 此函数接收两个结构体变量地址 分别为timeval timezone 两个结构体声明如下 struct t
  • 微软更新补丁目录查询

    微软更新补丁目录查询下载 传送门 在右上角的搜索框输入补丁编号即可 比如 KB5003638
  • 适合写API接口文档的管理工具有哪些?

    现在越来越流行前后端分离开发 使用ajax交互 所以api接口文档就变的十分有意义了 目前市场有哪些比较优秀的接口文档管理工具呢 1 MinDoc 网址 https www iminho me MinDoc 是一款针对IT团队开发的简单好用
  • 智头条」十四五数字经济发展规划发布,工信部推动充电标准统一

    行业动态 国务院印发 十四五 数字经济发展规划 国务院近日印发 十四五 数字经济发展规划 规划提出 推动5G商用部署和规模应用 加大6G技术研发支持力度 深化人工智能 虚拟现实 8K高清视频等技术的融合 加强和改进反垄断执法 进一步强化个人
  • 开篇导读

    你好 我是码闻强 拥有 12 年软件开发管理经验 创业前服务于杭州知时信息科技有限公司 任高级系统架构师 带领团队研发出一套适合汽车流通行业的 SaaS 产品 指是金融及周边配套产品 为业内数十家机构提供线上支撑服务 你是不是有这样的困惑
  • android edittext 监听输入完成,Android编程实现实时监听EditText文本输入的方法

    Android开发过程中经常使用EditText 有时您可能需要监视在textview中输入的单词数的状态和变化 下面就让爱站技术频道小编给大家带来的Android编程实现实时监听EditText文本输入的方法 分享给大家供大家参考 具体如
  • 疫情之下要不要转行?

    现在说这个话题可能有的人感觉有些晚了 但是我觉得还是可以聊聊 很有借鉴意义的 比较一起还在 生活还得继续 有很多东西还是需要去思考的 这里就把王豆豆的一篇关于是否要转行的文章 你且看 今年的疫情我一直在关注最新的情况 最近这几天国外感染人数
  • github 上传大文件的方法

    背景 版本库中有两个压缩包 大概在300M左右 上传时提示超过100M 上传失败 1 安装 git lfs git lfs install 2 跟踪指定大文件 可以使用 bin 之类的命令来跟踪一类文件 git lfs track root
  • 【JAVA核心】Java GC机制详解

    垃圾收集 Garbage Collection 通常被称为 GC 本文详细讲述Java垃圾回收机制 导读 1 什么是GC 2 GC常用算法 3 垃圾收集器 4 finalize 方法详解 5 总结 根据GC原理来优化代码 正式阅读之前需要了
  • private的构造函数

    package nuaa public class Xxx public int a private Xxx int a this a a System out println this a this a public static voi
  • avalon的使用与总结

    avalon是前端MVVM框架 将所有前端代码彻底分成两部分 视图的处理通过绑定实现 angular有个更炫酷的名词叫指令 业务逻辑则集中在一个个叫VM的对象中处理 我们只要操作VM的数据 它就自然而然地神奇地同步到视图 作用域绑定ms c
  • Keras实现Unet语义分割医学细胞图像并训练自己的数据集

    文章目录 一 Unet网络模型 二 代码运行 三 制作自己的数据集进行训练并测试标注 前言 本文实现keras下的Unet语义分割模型并且用自己制作的数据集进行训练并预测 本文引用了一些博文里面的内容 侵权请联系删改 引用的一些文章链接地址
  • linux+缺少+libc.so.6,libc.so.6 缺失问题

    今天中午 在Redhat AS5 上解决一个数据库连接问题 在应用的日志中发现如下报错信息 error client 145 24 216 86 lib libc so 6 libc start main 0xdc 0x4138cdec 在
  • 状态模式(State)

    1 概念 状态模式允许一个对象在其内部状态改变时改变它的行为 对象看起来似乎修改了它所属的类 属于行为型模式 2 模式结构 环境角色 Context 定义客户端所感兴趣的接口 并且保留一个具体状态类的实例 这个具体状态类的实例给出此环境对象