行为型模式-状态模式(State)

2023-10-31

概述

  当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。(定义)

  状态模式的核心理念就是将不同状态对应的行为封装到状态中,在状态变化时改变依赖状态对象的行为。

  那种在一个方法内对状态进行多重判断的方式,虽然可以根据不同的状态响应不同的结构,但不叫改变了行为方式,只是一种方法走向不同的分支。

结构

   上下文类: 它定义了客户程序需要的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。

​   抽象状态类: 定义一个接口,用以封装上下文对象中与状态相关的行为。

   具体实现类: 实现抽象状态所对应的行为。

实现

  对有状态的上下文对象,把与状态有关的复杂判断逻辑提取到不同的状态对象中,则在对象状态发生改变时上下文对象的行为也发生了改变。

在这里插入图片描述

优缺点

​  优点:

​    避免了多重判断的巨大语句块。

    将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。

​  缺点:

    状态模式的使用必然会增加系统类和对象的个数。

    状态模式对"开闭原则"的支持并不太好。当增加状态时需要修改上下文类。

使用场景

​  当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。

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

行为型模式-状态模式(State) 的相关文章

  • 设计模式之(三)---工厂方法模式

    女娲补天的故事大家都听过吧 这个故事是说 女娲在补了天后 下到凡间一看 哇塞 风景太优美了 天空是湛 蓝的 水是清澈的 空气是清新的 太美丽了 然后就待时间长了就有点寂寞了 没有动物 这些看的到 都是静态的东西呀 怎么办 别忘了是神仙呀 没
  • 小谈设计模式(1)—总序

    小谈设计模式 1 总序 专栏地址 开始操作 设计模式总论 设计模式是什么 组成要素 模式名称 问题描述 解决方案 效果描述 设计模式有什么作用 提供可重用的解决方案 提高代码的可读性和可维护性 促进代码的可扩展性 提高代码的灵活性和可重用性
  • 设计模式的 C++ 实现---工厂方法模式(二)

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 前言 对于工厂方法模式 当增加新产品时 也需要对应增加一个工厂类 可以使用模版进行封装 减少代码工作量 实现举例 产品抽象基类 class Animal pu
  • Java设计模式:装饰者模式(Decorator Pattern)

    装饰者模式 涉及的重要设计原则 类应该对扩展开放 对修改关闭 装饰者模式定义 装饰者模式动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 UML类图 装饰者模式事例 咖啡店 咖啡种类 1 深焙咖啡 DarkRoa
  • 简单工厂模式

    简单工厂模式 一 概念 从设计模式的类型上来说 简单工厂模式是属于创建型模式 又叫做静态工厂方法 StaticFactory Method 模式 但不属于23种GOF设计模式之一 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 简
  • C++设计模式-State状态模式

    State状态模式作用 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 UML图如下 State类 抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为 ConcreteState类 具体状态 每一
  • 设计模式——导论

    作为软件开发人员 我们在平时工作的过程中 往往需要编写很多的代码来实现我们的需求 很多的时候会造成代码臃肿和代码冗余的情况 这个时候我们需要引入一个理念 设计模式 设计模式存在的意义在于 1 使得我们的代码更加精炼 2 使我们代码的可读性更
  • 设计模式-2--工厂模式(Factory Pattern)

    一 什么是工厂模式 工厂模式 Factory Pattern 是一种创建型设计模式 它提供了一种创建对象的接口 但是将对象的实例化过程推迟到子类中 工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象 而无需暴露对象的实例化逻辑 工厂
  • 第12课:生活中的构建模式——想要车还是庄园

    用程序来模拟生活 从剧情中思考构建模式 与工厂模式的区别 与组合模式的区别 构建模式的模型抽象 类图 基于升级版的实现 模型说明 应用场景 故事剧情 下周就要过年了 这是 Tony 工作后的第一个春节 还是在离家这么远的北京工作 所以肯定不
  • 每日一问:你想如何破坏单例模式?

    前言 1 单例是什么 单例模式 是一种创建型设计模式 目的是保证全局一个类只有一个实例对象 分为懒汉式和饿汉式 所谓懒汉式 类似于懒加载 需要的时候才会触发初始化实例对象 而饿汉式正好相反 项目启动 类加载的时候 就会创建初始化单例对象 1
  • HeadFirst 设计模式学习笔记10——MVC分析

    1 M V C Model View Controller 模式 视图 控制器 这是一种范型 模型对象正是应用系统存在的理由 你设计的对象 包含了数据 逻辑和其他在你的应用领域创建定制的类 视图通常是控件 用来显示和编辑 控制器位于二者中间
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • Tomcat 系统架构与设计模式之工作原理篇

    本文以 Tomcat 5 为基础 也兼顾最新的 Tomcat 6 和 Tomcat 4 Tomcat 的基本设计思路和架构是具有一定连续性的 Tomcat 总体结构 Tomcat 的结构很复杂 但是 Tomcat 也非常的模块化 找到了 T
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • 设计模式(不懂)

    面试中经常问到设计模式 我才对这个东西了解了一下 才发现他是没有开发的新大陆 是oo设计的更高级别 能把设计模式搞懂 那oo你就搞的差不多了 随便看了还是很有意思的 虽然不怎么懂 百科名片 相关书籍 设计模式 Design pattern
  • 如何利用Requestly提升前端开发与测试的效率

    前端测试 在进行前端页面开发或者测试的时候 我们会遇到这一类场景 在开发阶段 前端想通过调用真实的接口返回响应 在开发或者生产阶段需要验证前端页面的一些 异常场景 或者 临界值 时 在测试阶段 想直接通过修改接口响应来验证前端页面是否正常
  • 设计模式详解---策略模式

    1 策略模式简介 策略模式 Strategy Pattern 是一种行为型设计模式 用于在运行时根据不同的情境选择不同的算法或策略 该模式将算法封装成独立的类 使得它们可以相互替换 而且可以独立于客户端使用它们的方式 1 1 主要角色 上下
  • 设计模式(3)--对象结构(5)--外观

    1 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得 这一子系统更加容易使用 2 两种角色 子系统 Subsystem 外观 Facade 3 优点 3 1 对客户屏蔽了子系统组件 减少了客户处
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 【设计模式之美】理论一:怎么才算是单一原则、如何取舍单一原则

    文章目录 一 如何判断类的职责是否足够单一 二 类的职责是否设计得越单一越好 开始学习一些经典的设计原则 其中包括 SOLID KISS YAGNI DRY LOD 等 本文主要学习单一职责原则的相关内容 单一职责原则的定义 一个类只负责完

随机推荐

  • Windows在命令行中直接使用conda虚拟环境以及一些实用的conda命令

    在命令行中输入conda env list 可以查看当前已有的全部conda虚拟环境 如下图 输入conda create n name python version可以创建指定python版本的名称为name的虚拟环境 输入conda c
  • Linux常用命令-2

    为了掌握本关知识 你需要掌握 Linux文件操作之创建文件 删除文件 Linux文件夹操作之创建文件夹 删除文件夹 文件和文件夹拷贝 移动 重命名 Linux文件操作 Linux系统中最常用的文件操作有创建 删除文件等 创建文件 linux
  • 【LaTeX Workshop】VS Code 与 SumatraPDF 双向链接配置方法

    TeX Live 2021 Sumatra PDF v3 4 6 64 bit VS Code v1 62 3 system setup LaTeX Workshop v8 22 0 SumatraPDF 配置 安装 SumatraPDF
  • luckysheet使用——导出并下载excel数据及钩子函数的使用等

    这里记录一些常用的API 包括对于获取整个在线excel的数据 使用钩子函数等 获取Excel数据luckysheet getAllSheets 可以将获取到的数据传递到后端通过JSONArray来获取 它是一个一个的sheet页对象的数组
  • C语言基础入门48篇_15_条件运算符(expr1?expr2:expr3,三元运算符,

    条件运算符是C语言中唯一的三元运算符 其基本形式为 expr1 expr2 expr3 一个条件运算符它需要三个表达式 如果expr1的值为非0 则整个条件表达式的值为expr2 如果expr1的值为0 则整个条件表达式的值为expr3 1
  • java和c++区别

    java string类写在heap中 无法修改 c 放在text区 可以修改 java 的块内镶嵌的块不允许变量名重复 c 允许 实行就近法则 转载于 https www cnblogs com bloomingFlower p 1161
  • saltstack之系统初始化状态编写

    saltstack之系统初始化状态编写 1 目录结构 2 关闭selinux 3 关闭防火墙 4 时间同步 chrony 5 内核优化与文件描述 6 ssh服务优化 7 精简开机系统服务 8 历史记录优化 设置终端超时时间 9 yum源 1
  • 数据库基础知识(MySQL入门)

    数据库基础知识 MySQL入门 文章目录 数据库基础知识 MySQL入门 一 基本概念 二 特点 一 基本概念 Information 信息是对客观世界中各种事物的运动状态和变化的反映 是数据的含义 Data 数据用来记录信息的可识别符号
  • java基本语法题目_JAVA的语法基础 练习题

    1 编写Java程序 声明两个int型变量 运用三元运算符判断两个变量是否相等 若不相等 求出两个数中较大的 public class 练习题 public static void main String args int a 10 int
  • 验证集准确率上不去_经验之谈|处理不平衡数据集的7个技巧

    作者 Ye Wu Rick Radewagen编译 ronghuaiyang 介绍 具体的领域中的数据集是什么样的 银行中的欺诈检测 市场中的实时投标 网络中的入侵检测 常见吗 这些领域中的数据 常常只有不到1 的少数 但是 有兴趣 的事件
  • jmeter 固定定时器

    固定定时器 Constant Timer 是一个定时器元件 可以在线程组中的每个线程之间添加固定的延迟时间 固定定时器会对每个线程的执行进行一定的暂停 聊一下和线程组中的调度器对线程组执行时长的影响 相同 都会影响线程组的运行时长 不同 固
  • 加载动态库失败(loadLibrary返回为空 GetLastError126)解决办法 dll有依赖的dll缺失

    问题 加载动态库失败 loadLibrary返回为空 排除 64位也对 平台相同 错误 至少找不到一个必需的隐式或转发依赖项 这个不影响 SmartPay PGL dll下的四个dll 则是他所依赖的四个dll 因为我这里有缺失 显示黄色的
  • 本地ubuntu22.04装cuda11.7+torch2.0.1流程记录

    想要更新cuda11 7 需要的驱动最低版本515 65 01 而我的电脑原驱动为470 需要更新 1 卸载原驱动 使用了命令 sudo apt get purge nvidia sudo apt get autoremove 用以下命令检
  • MATLAB矩阵乘法14例

    MATLAB矩阵乘法14例 简介 矩阵乘法是线性代数中的基本运算之一 也是MATLAB中的重要运算 矩阵乘法的结果是两个矩阵的乘积 其中一个矩阵的列数等于另一个矩阵的行数 在这篇文章中 我们将介绍20个MATLAB矩阵乘法的例子 帮助您更好
  • 什么是自动化测试框架?我们该如何搭建自动化测试框架?

    无论是在自动化测试实践 还是日常交流中 经常听到一个词 框架 之前学习自动化测试的过程中 一直对 框架 这个词知其然不知其所以然 最近看了很多自动化相关的资料 加上自己的一些实践 算是对 框架 有了一些理解 这篇博客 就聊聊自动化框架的一些
  • 根因定位FluxRank论文通过核密度估计(KDE)获得变化量部分

    II CHANGE QUANTIFICATION CHANGE QUANTIFICATION说明 A 变化开始时间 B 变化程度 论文 FluxRank A Widely Deployable Framework to Automatica
  • Mybatis之分页插件PageHelper工作原理

    前言 数据分页功能是软件系统中必备的功能 在持久层使用mybatis的情况下 pageHelper来实现后台分页则是我们常用的一个选择 所以本文专门介绍下 需要的依赖
  • Spring Boot 实现用户行为记录的四种方式

    目录 一 需求背景 二 需要的pom依赖 三 AOP切面编程实现 四 Interceptor拦截器实现 五 Filter过滤器实现 六 ArgumentResolver 七 拓展部分 八 参考文献 一 需求背景 根据产品经理要求 需要对用户
  • npx mkdirp命令

    npx是什么 npx 是 npm v5 2 0引入的一条命令 更方便开发者使用包内提供的命令行工具 ep1 npm原方式 npm install g create react app create react app my app npx方
  • 行为型模式-状态模式(State)

    概述 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 定义 状态模式的核心理念就是将不同状态对应的行为封装到状态中 在状态变化时改变依赖状态对象的行为 那种在一个方法内对状态进行多重判断的方式 虽然可以根据不同的状态