Java中的状态设计模式

在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式。

当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用。 当对象的行为取决于其当前状态时,我们应该主要使用它。 这种模式有助于我们避免在该类的方法中对对象的状态进行长时间的条件检查。

有了它,让我们开始吧!

状态设计模式:

我们可以用以下UML图表示状态设计模式:

哪里,

  • 状态–表示一个抽象类或接口,用于声明每个具体状态对象的最低预期功能
  • ConcreteState –这些是State的实现类
  • 上下文–这是我们公开的类,通常负责维护当前状态实例。 它还将责任委托给具体的状态类来执行任务

实施示例:

假设我们有一个自动皂液器。 理想分配OutOfStock -它非常能在这些国家存在。 让我们借助状态图将其可视化:

定义州类别:

我们首先从定义我们的DispenserState接口开始:

 public DispenserState {  void sensesHand(AutoDispenser autoDispenser); void stopsSensingHand(AutoDispenser autoDispenser);  } 

我们每个状态类都必须实现DispenserState并定义该状态的行为。 我们的IdleState类如下所示:

 public class IdleState implements DispenserState {  public void sensesHand(AutoDispenser autoDispenser) { System.out.println( "Hand sensed" ); autoDispenser.startDispensing(); autoDispenser.setDispenserState(autoDispenser.getDispensingState()); }  public void stopsSensingHand(AutoDispenser autoDispenser) { System.out.println( "Sensor inactive already!" ); }  } 

同样,我们可以定义代表状态的其他两个类:

 public class DispensingState implements DispenserState {  public void sensesHand(AutoDispenser autoDispenser) { System.out.println( "Already dispensing" ); }  public void stopsSensingHand(AutoDispenser autoDispenser) { System.out.println( "Stopped sensing" ); autoDispenser.stopDispensing(); if (autoDispenser.getQuantity() > 1 ) { autoDispenser.setDispenserState(autoDispenser.getIdleState()); } else { autoDispenser.setDispenserState(autoDispenser.getOutOfStockState()); } }  }   public class OutOfStockState implements DispenserState {  public void sensesHand(AutoDispenser autoDispenser) { System.out.println( "nothing to dispense" ); }  public void stopsSensingHand(AutoDispenser soapDispenser) { System.out.println( "dispenser is already inactive" ); }  } 

定义上下文:

最后,让我们定义上下文类– AutoDispenser ,它将与客户端代码交互:

 public class AutoDispenser {  private IdleState idleState; private DispensingState dispensingState; private OutOfStockState outOfStockState;  private DispenserState currentDispenserState;  public AutoDispenser() { this .idleState = new IdleState(); this .dispensingState = new DispensingState(); this .outOfStockState = new OutOfStockState(); if (getQuantity() > 0 ) { this .currentDispenserState = idleState; } else { this .currentDispenserState = outOfStockState; } }  public int getQuantity() { //returns current soap quantity ... }  public void startDispensing() { ... }  public void stopDispensing() { ... }  public void sensesHand() { this .currentDispenserState.sensesHand( this ); }  public void stopsSensingHand() { this .currentDispenserState.stopsSensingHand( this ); }   } 

在这里,我们保持自动分配器的当前状态,并在具体的状态类中调用该方法以实现操作。

为什么是国家模式?

除了帮助我们避免长期使用条件外,它还提供了其他好处:

  • 添加新状态非常简单明了,因为我们只需要定义另一个具体的状态类
  • 同样,删除状态仅需要删除关联的类
  • 使代码更易于阅读和遵循
  • 很好地证明了单一责任原则

结论:

作为程序员,对我们来说选择正确的设计模式以解决任何设计问题非常重要。

在本快速教程中,我们探索了状态设计模式。 我们了解了如何以及何时实施它。

翻译自: https://www.javacodegeeks.com/2019/09/state-design-pattern-java.html

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

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

相关文章

串口服务器工作方式及常见异常故障问题排除方法介绍

串口设备联网服务器就像一台带CPU、实时操作系统和TCP/IP协议的微型电脑,方便在串口和网络设备中传输数据。您可以在世界任何位置通过网络,用您的计算机来存取,管理和配置远程的设备。但是我们在实际使用串口服务器的过程中,难免会…

E1立体声卡侬头(XLR) 音频编解码器产品介绍

FCA系列音频编解码器是一种采用数字处理芯片及大规模FPGA、数字编解码转换和时钟恢复技术方法设计的基于E1(2M)通道传输立体声广播信号的广播传送设备系统,它可以借助目前成熟可靠的E1传输系统网,建立起数字立体声广播传送系统网络,实现广播传…

E1视音频编解码器应用方案详细说明

E1音频编解码器,是采用数字处理芯片及大规模FPGA、数字编解码转换和时钟恢复技术方法设计的。适用于广播节目源传输的设备。音频编码器是将输入的立体声音频信号,经A/D数字编解码变换或数据格式转换后,重新成帧,形成串行数据流&am…

Java中的外观设计模式

立面是指建筑物的外观。 当穿过街道时,我们所看到的只是建筑物的外观。 该图面抽象了建筑物的所有复杂实施细节。 同样, 外观设计模式旨在为子系统中的一组接口提供统一的接口。 这个统一的接口对客户端隐藏了子系统的复杂性。 它属于结构模式类别。 J…

串口服务器介绍及产品特点详解

串口服务器提供串口转网络功能,能够将RS-232/485/422串口转换成TCP/IP网络接口,实现RS-232/485/422串口与TCP/IP网络接口的数据双向透明传输。使得串口设备能够立即具备TCP/IP网络接口功能,连接网络进行数据通信,极大的扩展串口设…

串口服务器应用领域及应用方案详解

串口服务器提供串口转网络功能,使得串口设备能够立即具备TCP/IP网络接口功能,连接网络进行数据通信,极大的扩展串口设备的通信距离,应用领域非常广泛。接下来我们就来为大家详细介绍下串口服务器的应用领域及应用方案,…

多串口服务器的工作方式及接线示意图介绍

串口服务器提供串口转网络功能,能够将RS-232/485/422串口转换成TCP/IP网络接口,实现RS-232/485/422串口与TCP/IP网络接口的数据双向透明传输。那么,多串口服务器是怎么工作,怎么接线的?接下来就由飞畅科技小编一起来为…

多路串口服务器的应用及应用范围介绍

串口服务器的应用领域很是广泛,主要应用在门禁系统、考勤系统、售贩系统、POS系统、楼宇自控系统、自助银行系统、电信机房监控、电力监控等。接下来就由飞畅科技的小编来为大家详细介绍下多路串口服务器的应用及应用范围,感兴趣的朋友就一起来看看吧&am…

工业串口服务器如何使用

串口联网服务器让传统的RS-232/422/485设备立即联网,利用基于TCP/IP的串口数据流传输的实现来控制管理的设备硬件是专为串口转以太网设计连接的桥梁。那么,我们该如何正确使用工业串口服务器呢?接下来我们就跟随飞畅科技的小编一起来看看吧&a…

JMetro 5.5版发布

JMetro 5.5版刚刚发布。 进行了重大更新,其中添加了一些错误修复,样式和功能。 一个新的主题测试器示例应用程序也已添加到示例子项目中,该应用程序测试了几项内容,例如控件之间的对齐。 我将尽量使这篇文章简短,因为…

关于工业级RS485串口服务器的组网方式详解

工业级串口服务器提供串口转网络功能,是实现串口(TTL串口或RS232/RS485/RS422)数据与TCP/IP协议数据相互转换实现数据通过网络传输的工业互联通讯设备。通过连接多个串口设备并将串口数据流进行选择和处理,将串口数据转换为以太网…

什么是四路串口服务器?

四路串口RS232/RS422/RS485设备联网服务器(以下简称:串口服务器)是由杭州飞畅科技自主研发的串口设备联网产品,其中RS232/RS422/RS485可以任意组合使用(客户可定制)。那么,什么是四路串口服务器&#xff1f…

Java中的代理设计模式

代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问。 代理充当原始对象的轻量级版本或简化版本。 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它们。 代理设计模式是一种结构模式,其中代理类包装了实际…

什么是网络延长器?

网络延长器就是能够把网络传输距离有效延长的设备,网络延长器能够突破传统以太网传输距离100米以内的限制,可以通过双绞线将100M网络传输500米,10M网络传输1500米甚至更长。它将网络的传输距离的极限从铜线的100米扩展到千米以上,…

什么是延长器?延长器常见类型介绍

延长器是用来延长信号的器件,通常用于长距离直连线材无法满足传输要求的情况,一般是为了确保信号长距离无衰减的传输而设计,因此多是有源的。那么,什么是延长器?延长器的常见类型有哪些呢?接下来我们就一起…

solr 模糊匹配_Solr中的前缀和后缀匹配

solr 模糊匹配搜索引擎都是关于查找字符串的。 用户输入一个查询词,然后从反向索引中检索它。 有时,用户正在寻找的值只是索引中值的子字符串,并且用户可能也对这些匹配感兴趣。 对于德语这样的包含复合词(如Semmelkndel&#xff…

Java中的双重检查锁定

在本文中,我们将介绍在RxJava中创建Singleton对象的一些技术。 最重要的是,我们将学习Java中的双重检查锁定 。 Java中的Singleton模式是一种创新模式。 随着时间的流逝,人们开始关注Singleton模式的使用和实现。 这是由于单例的实现和使用方…

Java项目:书评

本文是关于这本书的 Peter Verhas撰写的Java Projects Second Edition 我去年写的 这样一篇文章的目的通常是为了促进这本书的销售。 在这种情况下没有什么不同,但是由于这是我写的书,而且我是撰写评论的人,因此赞美这本书将非常尴尬。 所以…

串口转换器的工作方式及通讯模式介绍

串口转换器能让您在配有RS-232的系统上使用RS-422及RS-485。它透明地将RS-232信号转成隔离的RS-422或RS-485信号。对此,您无需改变PC机任何的硬件或软件就能让您利用标准的PC硬件,来轻松构建一个工业级的长距离通信系统;基于TCP/IP和RS-485/4…

RS-232/E1协议转换器产品介绍

RS-232/E1协议转换器是我公司自主研发生产的高性能产品,它将透明E1转换为V.35或者RS232的异步数据接口的接口转换设备,本设备V.35接口可以连接DCE或DTE两种工作方式的设备,RS232接口只支持异步RS232数据,可支持的最高异步速率为11…