状态模式-概述

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

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.hqwc.cn/news/310447.html

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

相关文章

conda环境下nvrtc: error: invalid value for --gpu-architecture解决方法

1 问题描述 在运行视频处理的模型过程中&#xff0c;出现如下异常&#xff1a; nvrtc: error: invalid value for --gpu-architecture (-arch)nvrtc compilation failed: #define NAN __int_as_float(0x7fffffff) #define POS_INFINITY __int_as_float(0x7f800000) #define N…

Pytorch安装—CPU版(极速版)

准备工作&#xff1a; 下载python下载安装anaconda 一、anaconda创建名为pytorch的虚拟环境 #创建一个名为pytorch的虚拟环境 conda create create -n pytorch #通过以下语句进行检查&#xff1a; conda env list二、下载pytorch&测试 &#xff08;Pytorch官网现在pip包…

使用flutter开发windows桌面软件读取ACR22U设备的nfc卡片id,5分钟搞定demo

最近有个需求&#xff0c;要使用acr122u读卡器插入电脑usb口&#xff0c;然后读取nfc卡片的id&#xff0c;并和用户账号绑定&#xff0c;调研了很多方式&#xff0c;之前使用rust实现过一次&#xff0c;还有go实现过一次&#xff0c;然后使用electron的时候遇到安装pcsc-lite失…

Hexo 部署 Github Pages, Github Actions自动部署

想整个静态的博客部署在github pages 历经两天的折磨终于是摸索成功了&#xff0c;官网的文档太简陋了&#xff0c;很多东西没说清楚。 欢迎大家访问我的博客&#xff01; CanyueThis is Canyues blog.https://mobeicanyue.github.io/ 最终实现的效果&#xff0c;一个项目仓库…

R统计学1 - 基础操作入门问题1-20

R统计学入门基础问题 1. 如何生成100个高斯&#xff08;正态&#xff09;分布随机数 x <- rnorm(100, mean 5, sd 0.1) x # [1] 4.893534 5.046611 5.081097 4.979164 5.181700 5.038192 5.135376 5.173346 4.968877 4.986146 # [11] 4.946258 5.198199 5.055531 4.9430…

Linux 运维工具之1Panel

一、1Panel 简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 特点&#xff1a; 快速建站&#xff1a;深度集成 Wordpress 和 Halo&#xff0c;域名绑定、SSL 证书配置等一键搞定&#xff1b;高效管理&#xff1a;通过 Web 端轻松管理 Linux 服务器&#xff0…

【Matlab】ELM极限学习机时序预测算法

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88681649 一&#xff0c;概述 ELM&#xff08;Extreme Learning Machine&#xff09;是一种单层前馈神经网络结构&#xff0c;与传统神经网络不同的是&#xff0c;ELM的隐层神经元权重以及偏置都是随机产生的…

利用网络教育系统构建个性化学习平台

在现代教育中&#xff0c;网络教育系统作为一种创新的学习方式&#xff0c;为学生提供了更加个性化和灵活的学习体验。在本文中&#xff0c;我们将通过简单的技术代码&#xff0c;演示如何构建一个基础的网络教育系统&#xff0c;为学生提供个性化的学习路径和资源。 1. 环境…

迪杰斯特拉(Dijkstra)算法详解

【专栏】数据结构复习之路 这篇文章来自上述专栏中的一篇文章的节选&#xff1a; 【数据结构复习之路】图&#xff08;严蔚敏版&#xff09;两万余字&超详细讲解 想了解更多图论的知识&#xff0c;可以去看看本专栏 Dijkstra 算法讲解&#xff1a; 迪杰斯特拉算法(Di…

数据库开发之子查询案例的详细解析

1.5 案例 基于之前设计的多表案例的表结构&#xff0c;我们来完成今天的多表查询案例需求。 准备环境 将资料中准备好的多表查询的数据准备的SQL脚本导入数据库中。 分类表&#xff1a;category 菜品表&#xff1a;dish 套餐表&#xff1a;setmeal 套餐菜品关系表&#x…

【计算机网络】第五,六章摘要重点

1.运输层协议概述 运输层提供的是进程之间的通信 2. 3.套接字指的是什么 ip地址端口号 4.每一条TCP语句唯一地被通信两端连接的两个端点 5.TCP传输如何实现 以字节为单位的滑动窗口 超时重传 选择确认 6.TCP流量控制和拥塞控制的区别 流量控制&#xff1a;点对点通信…

SpringMVC学习与开发(四)

注&#xff1a;此为笔者学习狂神说SpringMVC的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! 11、Ajax初体验 1、伪造Ajax 结果&#xff1a;并未有xhr异步请求 <!DOCTYPE html> &…