设计模式之状态模式总结

购物车的设计模式 购物车的设计模式,使用图解的方式来说明的,使用的是MVC的层次开发模式 立即下载
快速解释

定义是这么写的,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。仔细揣摩这段定义,可以得出这么些细节,能使用状态模式的首先得有状态,有行为,而且状态不同,行为也不同,状态是可以改变的。老方法,我们举例说明,比如我们人,有生病和健康两种状态,在生病状态的时候我们除了卧床休息啥也干不了,行为可以是治疗。在健康的时候,我们可以有的行为可以是工作,学习等。但我们健康的时候不用治疗,生病的时候不能去工作和学习了。所以当我们改变状态的时候我们的行为也改变了。

实战

如果我们没用状态模式之前肯定会这样写,在一个类中定义一个state存储当前状态,然后定义一些方法表示各种行为,然后在各种行为的方法里进行判断是否是该状态下可以执行的行为。然后你就会发现一堆的if else 各种重复的条件判断,很显然这不符合我们设计模式的思想。所以我们进行了改进,使用状态模式,来看看用状态模式会怎样。

首先我们定义一个人状态的总接口,接口类中含有人各种状态下的的各种行为

public interface HumanState{
 public void study();
 public void work();
 public void treat(); //治疗
}

定义人在健康时候的状态,在类中实现该状态应该具有的方法

// 健康状态
public class HealthHuman implements HumanState {

    @Override
    public void study() {
        System.out.println("好好学习中 . . .");
    }

    @Override
    public void work() {
        System.out.println("好好工作中 . . .");
    }

    @Override
    public void treat() {
        // 不实现具体方法,因为该状态下不具备该行为

    }

}

// 生病状态

public class IllHuman implements HumanState {

    @Override
    public void study() {
        // 不实现具体方法,因为该状态下不具备该行为
    }

    @Override
    public void work() {
        // 不实现具体方法,因为该状态下不具备该行为
    }

    @Override
    public void treat() {
        System.out.println("接受治疗 . . .");
    }

}

此外我们需要一个操作接口,用来切换生病状态和健康状态(当然实际生活中人的状态不能想切换就切换,可以想象成游戏虚拟人物),然后提供统一的调用方法。

public class HumanController {
    HumanState state;

    // 设置当前状态类
    public void setState(HumanState state) {
        this.state = state;
    }

    // 切换成健康状态
    public void health() {
        setState(new HealthHuman());
        System.out.println("现在我是健康的了");
    }

    // 切换成生病状态
    public void ill() {
        setState(new IllHuman());
        System.out.println("现在我已经生病了");
    }

    public void work() {
        state.work();
        System.out.println("我在努力工作");
    }

    public void treat() {
        state.work();
        System.out.println("我在接受治疗");
    }

    public void study() {
        state.work();
        System.out.println("我在努力学习");
    }
}

调用代码

HumanController controller = new HumanController();
//切换成生病状态
controller.ill();
//调用治疗行为会有打印输出
controller.treat();
/*调用工作和学习行为是不会有打印的,因为该状态下不能有这种行为,
我们的状态类中并没有实现方法,该方法是空的。
*/
controller.work();
//切换成健康状态
controller.health();
//再调用工作方法就会有输出了
controller.work();
总结

可以看到,我们在用状态模式实现上述需求的时候代码看起来很舒服,状态模式适用于某一个对象的行为取决于该对象的状态,并且该对象的状态会在运行时转换,又或者有很多的if else判断,而这些判断只是因为状态不同而不断的切换行为。其优点是很明显的,代码不冗余,程序结构清晰可扩展,当然缺点也就是所有模式基本上都有的就是会增加一堆类,程序结构变复杂。

设计模式之状态模式(State) 状态模式(State) 用意:允许一个对象当状态改变时,改变其行为。 立即下载

相关推荐

订单支付交易原型及架构图、状态图

实用的订单支付界面原型、订单交易管理demo及相关文档

状态模式全解析:理论、实现与实际案例深度剖析

本文以电商订单管理为例,深入探讨了状态模式及其变种管道模式的应用。通过剖析状态与行为分离的核心思想,展示了如何在复杂状态切换场景中实现清晰且可扩展的代码设计。文章不仅详细讲解了实现步骤,还分享了实际业务中的应用经验,为开发者提供了解决复杂逻辑的新思路。设计模式的精髓在于灵活应用,状态模式无疑是提升代码质量的有力工具。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 171万+

C++学习(四六六)Multiple parse contexts are available for this file

Note: Multiple parse contexts are available for this file. Choose the preferred one from the editor menu 参考: "Multiple parse contexts" in Qt creator | Qt ForumHi Do you use sessions? https://bugreports.qt.io/browse/QTCREATORBUG-18521 Anyway, its not.

hankern的专栏 4609

状态模式总结

1、状态模式简述: 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到。然后使用if... ellse语句来做状态判断来进行不同情况的处理。但是对复杂状态的判断就显得“力不从心了”。随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱...

吕世良 677

Matlab使用GitHub的踩坑记录(持续更新)

Matlab使用git的踩坑记录前言Matlab设置Git的官方帮助文档系统配置新建Git两种代码管理方式典型源代码管理SVN分布式源代码管理 Git注意:SVN和Git都可以用GitHub创建新的库 前言 作为Git初学者,对Git的代码版本管理非常非常喜欢,给了我极大的安全感。特别是想到之前的几次Matlab、Latex和python的代码莫名其妙被折腾没了又没法找回的悲剧,决定慢慢的走入gi...

voluntry的博客 7296

元数据管理:DataHub和OpenMetadata对比分析

DataHub和OpenMetadata都试图解决数据编目,搜索,发现,治理和质量方面的相同问题。这两种工具都是出于为需要支持大量数据源、团队和用例的大型组织解决这些问题而诞生的。尽管这些工具在发布历史和成熟度方面略有不同,但它们的功能存在显着重叠。

weixin_38030820的博客 6632

项目中如何使用【设计模式】来处理【订单状态】?

应用场景 订单状态和操作

passerbyYSQ 3004

ORB-SLAM3的Euroc数据集测试

(一)测试运行 不同模式测试过程(以MH_03为例) 1、pure mono 运行SLAM: cd ORB-SLAM3/Example #run slam ./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH03 ./Monocular/EuRoC_TimeStamps/MH03.txt dataset-MH03_mono 利用ORB-SLAM3自带..

ljtx200888的博客 9143

【设计模式】订单状态流传中的状态机与状态模式

状态模式一般是用在对象内部的状态流转场景中,用来实现状态机。什么是状态机呢?状态机是对状态转移的抽象,由事件状态动作组成,事件有时候也被称为转移事件或者转移,当事件触发时,可以将状态由一个状态变更为另一个状态,并执行动作。其中,事件和状态是必须存在的,动作可以不要。下面是一张状态图,表达的就是一个状态机的模型。通俗来讲,就是对状态的变更做了一定的限制,不能随意的修改状态,而是只有处于某个特定的状态时,才能变更到另一个特定的状态。

积木成林,聚沙成塔 5282

Horn-Schunck光流算法的Python实现

光流是计算机视觉领域中的一个重要概念,它描述了图像中物体在时间上的运动。Horn-Schunck光流算法是一种经典的光流估计方法,通过对图像的亮度变化进行建模,来估计像素的运动速度。在本文中,我们将使用Python实现Horn-Schunck光流算法,并提供相应的源代码。请注意,该算法假设图像上的亮度变化主要由物体的运动引起,并且假设光流在整个图像上是稠密的。在上面的示例中,我们首先读取了两个输入图像,然后使用我们实现的Horn-Schunck光流算法估计了它们之间的光流。首先,我们需要导入一些必要的库。

持续更新 495

基于转录逆转的药物重定向 GPS 模型

GPS是一个基于分子结构预测基因表达扰动的开源平台,由三个模块组成:RCL(在LINCS扰动数据上训练抗噪MLP)、GPS4Drugs(预测新化合物的基因表达谱并进行逆转评分)、MolSearch(基于MCTS的分子优化)。平台使用Morgan指纹和Gene Ontology注释作为特征输入,将基因表达扰动离散为三分类标签。训练数据来自LINCS Phase I的18,746个化合物和978个landmark基因,支持四细胞系独立训练,可用于药物重定向与化合物筛选。

听雨草堂 83

状态模式

状态模式状态模式 State 概述基本介绍状态模式角色分析示例案例分析案例(不是太严谨,只关注设计模式)代码 状态模式 State 概述 基本介绍 状态模式主要用来解决对象在多种状态之间转换时,不同状态,行为不同的问题,当一个对象的内在状态发生改变时,该对象的行为也会发送相应的改变,在传统模式下通常使用一个字段来标识一个类的状态,然后通过逻辑代码去判断获取相应的状态,执行相应的操作,假设后续更改...

qq_29799655的博客 324

【异常】OpenClaw 项目 `fetch failed` 报错问题排查与解决方案Response interrupted: TypeError: fetch failed

针对无超时控制、异常兜底缺失导致的请求中断,封装标准化的安全请求工具,一次性解决超时控制、异常捕获、日志埋点三大问题,全项目替换原生。:将项目运行的 Node.js 版本升级至 18.x 及以上 LTS 版本,使用 Node.js 内置的稳定版。实现的网络请求环节,包括但不限于:第三方开放接口调用、内部服务接口通信、跨域资源请求、外部配置拉取等场景。:针对无法升级 Node.js 版本的存量环境,通过社区稳定兼容包替换原生。类型异常,直接造成业务请求响应中断。第二步:业务代码改造,替换原生。

奶爸的编程之路,也就一周冷个三天 366

【设计模式二十三之状态StatePattern模式】状态模式StatePattern

解释器模式细说解释器模式细说解释器模式定义UML模型基于UML的代码场景一场景代码场景二场景代码解释器模式应用和注意事项 细说解释器模式 提示: 博主:章飞 _906285288的博客 博客地址:http://blog.youkuaiyun.com/qq_29924041 细说解释器模式 定义 UML模型 基于UML的代码 场景一 场景 代码 场景二 场景 代码 解释器模式应用和注意事项 欢迎继续...

章飞 _906285288的博客 886

化工设计软件:PDMS二次开发_(7).数据导入与导出技术

在某些复杂场景下,PDMS提供的标准API接口可能无法满足需求。此时,可以通过自定义API接口来实现特定的数据导入与导出功能。自定义设备导入API接口可以处理更复杂的设备数据格式。# 导入必要的库import pdms_api # 假设有一个PDMS API库# 定义自定义设备数据# 自定义设备导入API接口# 调用自定义设备导入API接口# 输出导入成功的消息print("自定义设备数据导入成功")在PDMS二次开发中,数据的导入与导出是关键的技术环节。

kkchenjj的博客 1484

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java设计模式---状态模式(State pattern)

java设计模式—状态模式(State pattern) 1. 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,对于客户端而言,无须关心对象状态的转换以及对象所处的当前状...

渔潭的博客 477

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

二十三种设计模式——状态模式(State Pattern)

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使...

也曾北风温柔以待 554

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

23种设计模式之状态模式(State Pattern)

本篇文章将23种设计模式中的状态模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 1万+

设计模式-状态模式-State Pattern

这种模式通过将状态相关的行为封装在独立的类中,并在运行时根据状态对象来切换这些行为,从而使得对象能够在内部状态变化时合理地更改其行为。状态模式的优点在于它将状态相关的行为封装在具体的状态类中,使得状态转换逻辑清晰,并且可以在运行时动态地改变对象的行为。状态模式的优点包括局部化了状态相关的操作,将状态转换逻辑封装在状态对象内部,以及可以在运行时切换对象的行为。:在没有使用状态模式的情况下,对象的状态管理可能需要大量的条件分支语句,状态模式可以将这些条件分支分散到不同的状态类中。

wesigj的博客 2029

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

对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

码鹿的记录 631

设计模式:状态模式(State Pattern)

状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。

倔强老吕的博客 1211

设计模式之状态模式

设计模式是经验总结,是学习软件设计的有效方法,因此,了解和理解现有的设计模式,是提高软件设计的有效途径之一,这里将介绍相关的设计模式,并通过示例了理解其用法。本章主要介绍状态模式并进行示例。

ZhangCurie的博客 336

设计模式 ~ 行为型模式 ~ 状态模式 ~ State Pattern。

设计模式 ~ 行为型模式 ~ 状态模式 ~ State Pattern。 文章目录设计模式 ~ 行为型模式 ~ 状态模式 ~ State Pattern。

lyfGeek的博客 142

设计模式24:State Pattern (状态模式)

英文原文:http://www.dofactory.com/Patterns/PatternState.aspx一、State Pattern (状态模式)Define: Allow an object to alter its behavior when its internal state changes. The object will appear to change its cl

薛敬明的专栏 1897

JAVA设计模式之 状态模式【State Pattern】

一、概述     当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化。状态模式是一种对象行为型模式。 二、适用场景     用于解决系统中复杂对象的多种状态转换以及不同状态下行为的封装问题。简单说就是处理对象的多种状态及其相互转换。

小吕丶Code阶区 3891

设计模式(Design pattern)之状态模式(state Pattern)

状态模式在电梯系统中的应用 该代码展示了状态模式在电梯控制系统中的实现。通过抽象StateElevator类定义四种操作(open/close/run/stop),并由四个具体状态类(Open/Run/Stop/Close)实现不同状态下的行为逻辑。Context类作为环境角色维护当前状态,各状态类可通过super.context改变状态。这种设计避免了大量条件判断,使状态转换清晰可见,但实际应用中可能存在状态类膨胀的问题。示例演示了电梯从开启状态开始,依次执行运行、开启、关闭和停止操作的状态转换过程。

RR1335 之代码才是动力源 220
上一篇: 设计模式之策略模式总结
下一篇: 设计模式之责任链模式总结
HJsir
博客等级 码龄10年 19粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值