事物的状态-状态模式

状态模式——从斗地主开始说起 “人有悲欢离合,月有阴晴圆缺”。很多事物在特定条件下转换成不同的状态,在不同状态下表现出不同的行为。 在软件系统中,有些对象在不同的条件下也具有不同的状态,不同状态之间可以相互转换。通过判断不同的条件分支(if...else...或者switch..case...)可以进行状态的转换。但这样势必使得代码的判断逻辑变得复杂,降低系统的可维护性。如果新加入一种状态,还需要修改判断逻辑,不符合... 阅读详情

title: 事物的状态-状态模式
date: 2018-09-05 16:11:35
categories:

  • 工作
    tags:
  • Java

前段时间看到有代码在用状态机,而这段时间重温软件设计模式,刚好有状态模式,记录一下。

场景:

对于一个自动售卖机的小系统,往往会有,投币、售出、售罄、退钱等状态。状态之间需要转换,才能完成一系列操作,实现某一个完整的功能。

糟糕的解决方案

旧的解决方案是怎样的呢?
首先,用常量定义出所有状态。
在进行操作时,用if判断当前状态是否是定义出来的某个状态,然后进行相应的操作。同时进行状态的切换。

问题点:

用上述方法解决的问题,会有如下痛点:

  1. 扩展性极差,如果新增一个状态,需要变动原有逻辑代码,严重违反【对扩展开放】的原则。
  2. 随着时间流逝,主流程出现大量的if判断,导致某个方法过于庞大,不利于阅读维护。
  3. 完全是面向过程思维方式,不是面向对象的思考方式。

改良的解决方案

切入点:将每个状态的行为放在对应的状态类中,每个状态只要实现自己的动作就可以了。
思路:

  1. 定义一个状态接口(or 抽象类)。每个动作在接口中都有对应的方法。
  2. 每个具体的状态实现状态接口,并负责自己当前状态下各个方法的实现,eg:售出状态的退钱方法,取东西方法等。
  3. 最后,主流程里将动作委托给对应的状态类。

类图如下

image-20190914221223233

如图1状态模式类图所示,State是定义状态动作的接口,ConcreteStateA与ConcreteStateB是接口State的具体状态。Context是上下文中进行调用,调用State.handle方法,用多态代替了if。

在具体使用过程中,ConcreteStateA与ConcreteStateB或其他状态可以相互转换,也可以在Context中转换。同时,当遇到拓展时,比如新增状态ConcreteStateC,只需要新增ConcreteStateC实现State接口,完成handle,并在Context里进行调用。

Word中 Go to endnote 出现闪退问题解决办法 阅读详情

相关推荐

SDIO_WiFi驱动学习之SDIO架构介绍及源码分析

一、引言 因为WiFi驱动比较复杂,所以WiFi驱动的博客将分为两篇来写。 本篇博客主要介绍Linux下的SDIO架构及源码分析。 二、SDIO WiFi SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈,能够实现用户主平台数据通过SDIO口到无线网络之间的转换。SDIO具有传输数据快,兼容SD、MMC接口等特点。 对于SDIO接口的WiFi,首先,它是一个SDIO的卡设备,然后具备了WiFi的功能。所

陈子陌的博客 1万+

事务的ACID属性与状态

转自:http://blog.chinaunix.net/uid-7345847-id-2643947.html   事务的ACID属性 1. 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。   2. 一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 3. 隔离性(Isola...

nexus_的博客 674

深入理解搜索引擎——搜索评价指标

    搜索引擎,在做好query理解、索引召回以及排序模型之后,就能直接推上线了吗?答案是否定的,还需对其性能和质量进行评测。性能无非是对时间和空间的运行效率作评测,不细讲,今天讲讲搜索引擎的质量评测。通过质量评测,可根据评测结果不断的进行改进和研究,也可以验证搜索引擎在真实环境中运行时的实际效果。因此,搜索引擎的质量评测对于整个系统的研制和发展是至关重要的。     那么有哪些指标可以评估搜索引擎的结果质量呢?最广为人知的

我是药老的博客 4485

事务都有哪些状态

在数据库管理系统(DBMS)中,事务(Transaction)是数据库操作的最小工作单位,它遵循ACID特性(原子性、一致性、隔离性、持久性)。

u012534547的博客 988

计算机视觉:暗通道去雾算法的原理及python实现

在绝大多数非天空的局部区域中,某些像素总会至少有一个颜色通道的值很低。对于一幅图像J(x),其暗通道的数学定义表示如下:其中,Ω(x)表示以x为中心的局部区域,上标c表示RGB三个通道。该公式的意义用代码表达也很简单,首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定。

weixin_51998427的博客 1万+

SMILES:化学结构的线性表示方法

SMILES:化学结构的线性表示方法

jasminefeng的博客 1万+

MySQL(五):事务简介、事务的特性、事务的概念及状态、支持事务的引擎

事务简介、事务的特性、事务的概念及状态、支持事务的引擎

m0_60631323的博客 1284

手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

数字IC后端设计培训教程之手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

weixin_37584728的博客 2931

Spring中事务使用

Spring中的事务,用注解实现也就是一个@Transactional,这个注解有六个参数 1、propagation传播行为,也就是多事物之间进行调用的时候做出的一些策略,例如a方法调用b方法。有两个常用的参数,REQUIRES如果a方法有事务,b方法没事务,那么b会跟这a事务进行运行,如果a没有事务,b有事务,那么会创建新的事务,REQUIRES_NEW不管ab方法是否有事务,都会创建新事务。 2、isolation隔离级别,也就是数据库的四种隔离级别。 3、timeout超时时间,开启事务到提交的时间

1696

树莓派4B安装 ubuntu20.04 & VNC远程桌面 & 安装ROS noetic

树莓派4B安装ubuntu20.04 & VNC远程桌面1、安装ubuntu方式1:下载Imager文件。方式2:下载镜像文件。2、查询树莓派 IP 地址3、使用ssh远程登录树莓派4、更新源地址5、更新6、安装桌面环境7、允许root登陆8、登陆远程桌面9、设置中文 1、安装ubuntu 方式1:下载Imager文件。...

weixin_44415639的博客 2万+

Luma AI技术浅析(一)

是一款基于人工智能的3D内容生成平台,旨在通过深度学习技术实现高效、高质量的3D场景、物体和动画的生成。Luma AI 主要利用了等技术,以实现从图像、视频到3D模型的转换和生成。

m0_75253143的博客 1727

java中事物的状态有哪些,Java基础四

数组原理内存图为了提高运算效率,就对空间进行了不同区域的划分,因为每一篇区域都有特定的出来数据方式和内存管理方式。栈的特点:先进后出JVM的内存划分:区域名称作用寄存器给CPU使用,和我们开发无关本地方法栈JYM在使用操作系统功能的时候使用,和我们开发无关方法区存储可运行的class文件堆内存存储对象或数组,new来创建的,都存储在堆内存方法栈方法运行时使用的内存,比如main方法运行,进入方法栈...

weixin_33743292的博客 360

ICC2: pin shape不在track上引起的drc如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 433

状态模式(事物的状态)

基本常识:策略模式和状态模式是双胞胎,在出生的时候才分开。策略模式时围绕可以互换的算法来创建成功业务的。然而,状态走的是更崇高的一条路,它通过改变对象内部的状态来帮助对象控制自己的行为。 一个通用的技巧:通过对对象内部的状态建模------通过创建一个实例变量来持有状态值,并在方法内书写条件代码来处理不同的状态。 具体的操作流程: 1,首先,找出所有的状态。 不画图了,用()代替圆

pipisky2006的专栏 1158

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

状态模式(State Pattern)——事物的状态

周一前补上

hqing159的博客 506

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

设计模式——状态模式

1、定义 事物内部状态的改变往往会带来事物的行为改变。在处理的时候,将这个处理委托给当前的状态对象即可,该状态对象会负责渲染它自身的行为 2、核心 区分事物内部的状态,把事物的每种状态都封装成单独的类,跟此种状态有关的行为都被封装在这个类的内部 3、优缺点 优点:状态切换的逻辑分布在状态类中,易于维护 缺点: 多个状态类,对于性能来说,也是一个缺点,这个缺点可以使用享元模式来做进一步优化 将逻辑...

weixin_38629440的博客 69

状态模式(State Pattern)——事物状态

前言​ 前阵子被大师带着写界面,还装逼学了一下react(这里是我的react博客)。在传统的开发中,通常 UI 上诸多状态变化会让维护应用的状态变得很困难和复杂。React 通过检测状态变化来每次重新渲染虚拟 DOM 节点,然后按需自动更新真实节点,这种方式可以让开发人员可以简单地专注在应用的状态上。​ 在react中,数据控制UI,数据变化其实可以看做变量状态的改变。这就引出了我们今天要

hqing159的博客 474

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

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

章飞 _906285288的博客 886

【设计模式精讲】行为型模式之状态模式

自然界很多事物都有多种状态,而且不同状态下会具有不同的行为,这些状态在特定条件下还会发生相互转换,比如水在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同状态下也将具有不同的行为.状态模式(state pattern)的定义: 允许一个对象在其内部状态改变时改变它的行为. 对象看起来似乎修改了它的类.状态模式。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

状态模式介绍

状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中(用类来表示状态) ,使得对象状态可以灵活变化。今天我们就来介绍下状态设计模式。

qq_25409421的博客 1488

c语言设计模式--状态模式(状态机)

模式动机状态模式(状态机)是嵌入式开发中最重要、最核心的设计模式之一,毫不夸张的说,是否熟练掌握状态模式,很大程度上直接决定了嵌入式工程师的代码掌控能力。在嵌入式开发里面,几乎80%以上...

qq_35579835的博客 9982

JavaScript状态模式

JavaScript状态模式 1 什么是状态模式 2 使用状态模式改造电灯程序 3 缺少抽象类的变通方式 4 示例:文件上传 4.1 场景描述 4.2 代码过程

橘猫吃不胖的博客 1499

JAVA设计模式之状态模式详解

自然界很多事物都有多种状态,而且不同状态下会具有不同的行为,这些状态在特定条件下还会发生相互转换,比如水在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同状态下也将具有不同的行为.状态模式(state pattern)的定义: 允许一个对象在其内部状态改变时改变它的行为. 对象看起来似乎修改了它的类.状态模式。

励志成为一名优秀的全能型软件开发工程师。 2503

设计模式之状态模式

状态(State)模式属于行为型设计模式,对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为,对象看起来似乎修改了它的类。简单的说,就是定义好各个状态(一般是定义好的),通过一个中间对象来设置和获取当前状态,并执行对应状态的方法。状态模式的关键是区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变。

zoey的专栏 1218

设计模式-状态模式

状态模式是一种行为设计模式,使用状态模式,能够在一个对象内部状态变化时改变它的行为,使其看起来就像改变自身的类一样。核心点:区分事物内部的状态,把事物的每种状态都封装成单独的类,跟此状态有关的行为都被封装在这个类的内部,当对象的状态改变时,它的行为也会随之改变。

zhangyifang_009的博客 1193

JavaScript设计模式之状态模式

什么是状态模式? 状态模式是一种非同寻常的优秀模式,它也许是解决某些需求场景的最好方法。虽然状态模式并不是一种简单到一目了然的模式(它往往还会带来代码量的增加),但你一旦明白了状态模式的精髓,以后一定会感谢它带给你的无与伦比的好处。 状态模式的关键是区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变。 初识状态模式 我们来想象这样一个场景:有一个电灯,电灯上面只有一个开关。当电灯开着的...

仇益阳的博客 1万+

23种设计模式——状态模式

状态模式本质:根据状态来分离和选择行为。状态驱动,上下文负责

qq_51165184的博客 3460
上一篇: 关于Linux的TCP相关参数的整理
下一篇: ElasticSearch与kibana流水账
chengshuo678
博客等级 码龄14年 5粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值