设计模式之~状态模式

news/2024/11/23 13:12:31/

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

  • 能够让程序根据不同的外部情况来做出不同的响应,最直接的方法就是在程序中将这些 可能发生的外部情况全部考虑到,使用if else 语句来进行代码响应选择。但是这种方法对于复杂一点的状态判断,就会显得杂乱无章,容易产生错误,而且增加一个新的状态将会带来大量的修改。

  • 这个时候“根据状态决定行为”的状态模式的引入也许是个不错的主意。状态模式可以有效的替换充满在程序中的 if else 语句:将不同条件下的行为封装在一个类里面,再给这些类一个统一的父类来约束他们

结构图:

        状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化

优点:

  • 好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。(每个状态类的职责单一明确,易于扩展)

  • 将特定的状态相关的行为都放入一个独立对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。目的就是为了消除庞大的条件分支语句,大的分支判断会使得它们难以修改和扩展,就像最早说的刻板印刷一样,任何改动和变化都是致命的。

  • 状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。

缺点:

  • 状态过多会引起类膨胀(事实上这也是大部分设计模式的通病)。

  • 状态模式的结构与实现相对较为复杂,容易造成代码混乱。

  • 对于支持状态切换的状态类违反了开闭原则,因为一旦状态修改或者中间要新增状态,则需要修改对应的源代码,否则会出现状态切换错误。

适用场景:

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

  • 另外如果业务需求某项业务有多个状态,通常都是一些枚举常量,状态的变化都是依靠大量的多分支判断语句来实现,此时应该考虑将每一种业务状态定义为一个State的子类。这样这些对象就可以不依赖于其他对象而独立变化了,某一天客户需要更改需求,增加或减少业务状态或改变状态流程,都不是困难的事。

状态模式和策略模式对比:

        状态模式和策略模式都能用来消除大量的if/else场景,但是也有本质区别:

  • 策略模式中各个策略之间是独立的,相互可以替换的,任意选择其中一个策略就能满足需求,而且是由客户端自己做出选择。而状态模式客户端只能选择初始节点,后续就会自动流转,各个状态是一个整体,不存在可以互相替换的状态。

  • 最根本的差异在于策略模式是在求解同一个问题的多种解法,这些不同解法之间毫无关联;状态模式则不同,状态模式要求各个状态之间有所关联,以便实现状态转移。

  • 区分这两个模式的关键是看行为是由状态驱动还是由一组算法驱动

 


http://www.ppmy.cn/news/137268.html

相关文章

一个注解的事儿,数据脱敏解决了

目录 什么是数据脱敏开整使用 Hutool 工具类实现数据掩码Hutool 信息脱敏工具类使用 Jackson 进行数据序列化脱敏 注解实现数据脱敏1、定义一个注解2、创建一个枚举类3、创建我们的自定义序列化类4、测试 项目 pom 文件 总结 本文主要分享什么是数据脱敏,如何优雅的…

修复电动牙刷

电动牙刷 飞利浦6750,服役三年多。 一天,突然不能正常工作,正常工作时间为两分钟,这下几秒就停。 拆开检查,电池处有水迹,存在跑电现象,用吹风机吹干,装回。 正常用了几天&#…

智能牙刷

资料整理: 一,牙刷震动方式 1.偏振式 2.回转式 二,电机种类 1.机械扭力式振荡电机 2.有刷旋转电机 3.有刷往复式振动电机 4.无刷往复式振电机 三,电路设计 主柄:蓝牙无线充电电机控制状态指示(LED、震动、…

飞利浦 27B1U7903 评测怎么样

这款显示器采用27英寸4K分辨率60Hz刷新率的MiniLED IPS屏,具有1300:1的对比度,而且通过DisplayHDR 1400认证,色域达到Adobe RGB 99.2%。 飞利浦 27B1U7903更多使用感受和评价:http://www.adiannao.cn/dy 此外,这款显示…

超声波五档电动牙刷方案

两个按键,4个指示灯,一个充电指示灯,3个档位指示灯。 三个档位,低速,高速、震动。每个档位工作30S停0.5秒,总共工作2分钟&#…

电动牙刷技术方案

松翰半导体推出电动牙刷技术方案 电动牙刷技术方案 电动牙刷技术方案优势 • 芯片选型型号丰富,可符合多种设计要求 • 部分方案已成熟量产,稳定性高 • 智能控制,集成度高 完善的研发团队,提供专业的技术支持 • 性价比高 …

超声波牙刷VS电动牙刷

首先,我先纠正大家一个错误:超声波牙刷与电动牙刷不是两类牙刷,超声波牙刷也属于电动牙刷的一种(电动牙刷的定义是使用电能驱动的牙刷)。我们常说的电动牙刷通常指机械式牙刷,也就是通过刷毛和牙齿的剧烈摩…

电动牙刷无线充电解决方案

FS68001工作电压为 3.3V 至 18V,支持各种5W无线充充电方案 FS68001可以在任意 PCB 板上刻蚀线圈,在特殊需求下,可以直接使用 4.2V 锂电池直接为发射部分提供电源。芯 片采用 SOP-8 封装,尺寸得以进一步压缩。外围器件上也做了大…