当前位置: 首页 > news >正文

状态模式-概述

在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,
而且对象在不同的状态下也将具有不同的行为。相同的方法在不同的状态中可能会有不同的实现。
为了实现不同状态下对象的各种行为以及对象状态之间的相互转换。

class Account {private String state;//状态private int balance;//余额//存款操作public void deposit(){stateCheck();}//取款操作public void withdraw(){if(state.equalsIgnoreCase("NormalState") ){//取款stateCheck();} else{//取款受限}}public void computeInterest(){if(state.equalsIgnoreCase("OverdraftState")){//计算利息}}//状态检查和转换操作public void stateCheck(){if(balance>=0){state= "NormalState"}else if(balance >-2000 && balance <0){state= "OverdraftState"}else if(balance == -2000){state= "RestrictedState"}else if(balance< -2000){//操作受限}}......
}

发现存在几个问题:
1.几乎每个方法都包含状态判断语句,以判断在状态下是否具有该方法以及在特定状态下该方法如  何实现,导致代码非常冗长,可维护性较差。
2.拥有一个较为复杂的stateCheck()方法,包含大量的if...else if ...语句用于进行状态转换,代码测试难度较大,且不易维护。
3.系统扩展性较差,如果需要增加一个新的状态,如冻结(Frozen State)在该状态下既不允许存在也不允许取款,需要对原有代码进行大量修改,扩展起来非常麻烦。

为了解决这些问题,我们将对象在每一个状态下的行为和状态转移语句封装在一个个状态类中,通过这些状态类来分散冗长的条件转移语句

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

允许一个对象在其内部状态改变时改变它的行为,
对象看起来似乎修改了它的类。
其别名为状态对象,
在状态模式结构中包含如下几个角色:
1.Context环境类,它是拥有多种状态的对象。
  由于环境类的状态存在多样性且在不同状态下
  对象的行为有所不同,因此将状态独立出去形成
  单独的状态类。在环境类中维护一个抽象状态类State的实例,
  这个实例定义当前状态,在具体实现时,它是一个State子类的对象
  
2.State抽象状态类:
  它用于定义一个接口以封装与环境类的一个特定状态相关的行为,
  在抽象状态类中声明了各种不同状态对应的方法,
  而在其子类中实现类这些方法,由于不同状态下对象的行为可能不同,
  因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象
  状态类中。
3.具体状态类,


我们将对象在不同状态下的行为封装到不同的状态类中。

相关文章:

  • 网络交换机端口管理会面临的问题
  • 在线客服选择要点分析:如何挑选适合您需求的客服解决方案
  • Zookeeper-Zookeeper应用场景实战(二)
  • ElementUI的Table组件行合并上手指南
  • 玩转MYSQL|详细分析mysql-MGR集群搭建
  • 基于SpringBoot的客户关系管理系统
  • 为什么深度学习神经网络可以学习任何东西
  • SElinux工作原理简介并演示chcon、semanage、restorecon的使用方法
  • 微信小程序与vue区别
  • 手动创建idea SpringBoot 项目
  • AI与数字化映像:颜值开端,功能至上_光点科技
  • 大语言模型(LLM)训练平台与工具
  • flowable工作流看这一篇就够了(进阶篇 下)
  • Web常用的编码和解码技术
  • 原型继承在 JavaScript 中是如何工作
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • ES6系列(二)变量的解构赋值
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • React系列之 Redux 架构模式
  • spark本地环境的搭建到运行第一个spark程序
  • TCP拥塞控制
  • 关于字符编码你应该知道的事情
  • 利用jquery编写加法运算验证码
  • 深入浏览器事件循环的本质
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 我建了一个叫Hello World的项目
  • 学习ES6 变量的解构赋值
  • 异常机制详解
  • postgresql行列转换函数
  • 整理一些计算机基础知识!
  • $$$$GB2312-80区位编码表$$$$
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (55)MOS管专题--->(10)MOS管的封装
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (function(){})()的分步解析
  • (第30天)二叉树阶段总结
  • (六)软件测试分工
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)UDP基本编程步骤
  • (转)3D模板阴影原理
  • (转)我也是一只IT小小鸟
  • .NET MVC之AOP
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET命令行(CLI)常用命令
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @JSONField或@JsonProperty注解使用
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ACTF2020 新生赛]Upload 1
  • [AIGC 大数据基础]hive浅谈
  • [BZOJ1178][Apio2009]CONVENTION会议中心