状态模式-概述

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

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.具体状态类,


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Apache Doris】自定义函数之 JAVA UDF 详解

【Apache Doris】自定义函数之 JAVA UDF 详解 一、背景说明二、原理简介三、环境信息3.1 硬件信息3.2 软件信息 四、IDE准备五、JAVA UDF开发流程5.1 源码准备5.1.1 pom.xml5.1.2 JAVA代码 5.2 mvn打包5.2.1 clean5.2.2 package 5.3 函数使用5.3.1 upload5.3.2 使用 六、注意事…

2023年03月18日_微软office365 copilot相关介绍

文章目录 Copilot In WordCopilot In PowerpointCopilot In ExcelCopilot In OutlookCopilot In TeamsBusiness Chat1 - copilot in word2 - copilot in excel3 - copilot in powerpoint4 - copilot in outlook5 - copilot in teams6 - business chat word 1、起草草稿 2、自动…

JavaScript使用教程(二):类型、值和变量

计算机程序通过操作值&#xff08;如数值3.14&#xff09;或文本&#xff08;如“Hello World”&#xff09;来工作。编程语言中这些可以表示和操作的值被称为类型&#xff0c;而一门语言支持的类型集也是这门语言最基本的特征。程序在需要把某个值保存下来以便将来使用时&…

腾讯云系统盘50G通用型SSD云硬盘不够用怎么办?

腾讯云服务器系统盘50G通用型SSD云硬盘不够用怎么办&#xff1f;可以云硬盘扩容&#xff0c;也可以挂载数据盘。腾讯云服务器的系统盘可以不停服在线扩容&#xff0c;数据存储也可以通过挂载数据盘来实现更大的容量空间。腾讯云百科txybk.com分享腾讯云服务器系统盘不够用的操作…

2023 年终总结

引言 先说 2022 年留下的期待完成情况 健身&#xff0c;经过教练的指导后&#xff0c;自己开始做计划锻炼了&#xff0c;逐渐掌握到健身的要领&#xff1a;脸皮厚。 读书&#xff1a;今年可以说是读书最多的一年了&#xff0c;书单很长 旅行&#xff1a;去了上海&#xff0c;哈…

HTML5 Canvas 面试题

HTML5 Canvas 面试题 什么是HTML5 Canvas&#xff1f; Canvas是HTML5提供的一个绘图API&#xff0c;它允许通过JavaScript在网页上动态绘制图形、图像以及进行图形处理。 如何在HTML中创建一个Canvas元素&#xff1f; 使用<canvas>标签即可创建一个Canvas元素&#xff0…

VSCODE 修改Test模式下的的java jvm堆内存大小

在settings.json中添加如下语句 "java.test.config": {"vmArgs": ["-Xmx12G"]},

LeetCode75| 单调栈

目录 739 每日温度 901 股票价格跨度 739 每日温度 求后面第一个比他大的元素的位置&#xff0c;单调栈需要递增 求后面第一个比他小的元素的位置&#xff0c;单调栈需要递减 本题栈头到栈底的顺序应该从小到大 class Solution { public:vector<int> dailyTemperatures…

k8s中DaemonSet实战详解

一、DaemonSet介绍 DaemonSet 的主要作用&#xff0c;是在 Kubernetes 集群里&#xff0c;运行一个 Daemon Pod。DaemonSet 只管理 Pod 对象&#xff0c;然后通过 nodeAffinity 和 Toleration 这两个调度器参数的功能&#xff0c;保证了每个节点上有且只有一个 Pod。 二、Daem…

软件测试/测试开发丨Python 内置库 正则表达式re

什么是正则表达式 正则表达式就是记录文本规则的代码可以查找操作符合某些复杂规则的字符串 使用场景 处理字符串处理日志 在 python 中使用正则表达式 把正则表达式作为模式字符串正则表达式可以使用原生字符串来表示原生字符串需要在字符串前方加上 rstring # 匹配字符…

面试算法:归并排序

题目 归并排序也是一种基于分治法的排序算法。为了排序长度为n的数组&#xff0c;需要先排序两个长度为n/2的子数组&#xff0c;然后合并这两个排序的子数组&#xff0c;于是整个数组也就排序完毕。 分析 归并排序可以用迭代代码实现。例如&#xff0c;输入一个长度为8的数组…

《深入理解JAVA虚拟机笔记》垃圾回收器

JVM 判定 Java 对象是否为垃圾的方法 引用计数算法 很多教科书判断对象是否存活的算法是这样的: 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为…

【K8S 基本概念】Kurbernetes的架构和核心概念

目录 一、Kurbernetes 1.1 简介 1.2、K8S的特性&#xff1a; 1.3、docker和K8S&#xff1a; 1.4、K8S的作用&#xff1a; 1.5、K8S的特性&#xff1a; 二、K8S集群架构与组件&#xff1a; 三、K8S的核心组件&#xff1a; 一、master组件&#xff1a; 1、kube-apiserve…

Python函数中的*args,**kwargs作用与用法

前言 最近在使用Python函数的时候&#xff0c;经常碰见函数中使用*args、**kwargs&#xff0c;而且参数的传递也是非常奇特&#xff0c;就特意对Python函数中*args、**kwargs进行了查询&#xff0c;下面就以实例进行说明。 1 Python中的*args、**kwargs 在 Python 中&#x…

SpringBoot自动配置原理和自定义启动器

1、自动配置的原理 项目在加载上下文时&#xff0c;会根据SpringBootApplication注解运行。该注解中有一个CompoentScan注解&#xff0c;会扫描和加载当前启动类所在的目录&#xff0c;以及所有的子目录&#xff1b;还有一个是EnableAutoConfiguration注解&#xff0c;这个注解…

AngularJS表达式

AngularJS 使用 表达式 把数据绑定到 HTML。 AngularJS 表达式 AngularJS 表达式写在双大括号内&#xff1a;{{ expression }}。 AngularJS 表达式把数据绑定到 HTML&#xff0c;这与 ng-bind 指令有异曲同工之妙。 AngularJS 将在表达式书写的位置"输出"数据。 …

html文件Js写输入框和弹框调接口jQuery

业务场景&#xff1a;需要使用写一个html文件&#xff0c;实现输入数字&#xff0c;保存调接口。 1、使用 JS原生写法&#xff0c; fetchAPI调接口&#xff0c;使用 alert 方法弹框会阻塞线程&#xff0c;所以写了一个弹框。 <!DOCTYPE html> <html lang"en"…

Linux文件的扩展属性 attr cap

文件属性 Linux文件属性分为常规属性与扩展属性&#xff0c;其中扩展属性有两种&#xff1a;attr与xattr. 一般常规的文件属性由stat API 读取&#xff0c;一般是三种权限&#xff0c;ower, group&#xff0c;时间等。 扩展属性attr 用户态API ioctl(fd, FS_IOC32_SETFLAGS…

前端性能优化 将资源放到 linux 服务器上 提升访问效率

我们先远端连接服务器 然后服务器终端输入 mkdir 目录路径建出一个新的文件路径 回到我们自己的电脑 然后 在要缓存到服务器的文件目录下打开终端 输入 scp -r ./xidis.hdr 用户名 如果没设置用户名就是root服务器公网IP:/root/xhdr例如 scp -r ./xidis.hdr root1.113.266…

链表的一些典型问题

求链表的中间节点/倒数第K个节点 等类似的随机访问&#xff0c;可以考虑用快慢指针 例 求链表的中间节点 可以定义两个指针&#xff0c;一个一次走两步一个一次走一步&#xff0c;当走的快的走到NULL时&#xff0c;走的慢的就是链表的中间节点。&#xff08;此法求出的偶数个…