java设计模式之状态模式_Java中的状态设计模式

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

java设计模式之状态模式

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

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

相关文章

php概率计算_PHP指定概率算法

PHP指定概率算法,可用于刮刮卡,大转盘等抽奖算法。假设:有一个二维数组,记录了所有本次抽奖的奖项信息:$test_arr array(a>20,b>30,c>50);a奖概率20%,b奖概率30%,c奖概率50%模拟函数执…

os如何处理键盘的所有按键,显示or不显示,显示是如何显示

【0】README 0.1) source code and text decription are from orange’s implemention of a os , and for complete code , please visit 我待会上传; 【1】 键盘输入缓冲区 step1)缓冲区的数据结构如下: step2)对…

Hibernate的缓存机制/会话级缓存机制

Hibernate 中维持了两级缓存。第一级缓存由 Session 实例维护,该缓存区保存着与该 Session 实例有关联的所有实体对象的数据,也称为内部缓存。而第二级缓存则存在于 SessionFactory 实例中,由通过该 SessionFactory 实例获取的所有 Session 实…

orm提取指定列_使用ORM提取数据很容易! 是吗?

orm提取指定列介绍 几乎所有系统都以某种方式与外部数据存储一起运行。 在大多数情况下,它是一个关系数据库,并且通常将数据获取委托给某些ORM实现。 ORM涵盖了很多例程,并且带来了一些新的抽象作为回报。 Martin Fowler写了一篇有关ORM的有…

如何编译文件(gcc + nasm)

【0】README 编译文件(nasm gcc),特别是编译目标文件的依赖文件;本文旨在回顾 gcc 和 nams 编译器的编译命令,以及如果有多个依赖文件该如何编译; 【1】编译文件 1.1)编译 lib/syscall.asm(lib/syscall.asm) nasm …

Hibernate中的Session.load() 和 Session.get() 的区别

文章目录相同点区别懒加载的问题执行语句 session.load(UserInfoBean.class,2) 会先在一级缓存中找 id2 的 UserInfoBean 对象(看红色线条),找不到去二级缓存找,还找不到就不找了,直接获取一个代理对象并返回该对象。当…

python 分布式队列_〖Python〗-- Celery分布式任务队列

【Celery分布式任务队列】一、Celery介绍和基本使用Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可…

最大子序列和问题的解(共4种,层层推进)

【0】README 0.1) source code and text description are from data structure and alg analysis ; 0.2) there are 4 methods solving maximum sum of subsequence, but the fourth proves to be the best one , the 3rd deser…

java设计模式代理模式_Java中的代理设计模式

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

Struts2参数值自动注入到JavaBean对象的属性中和JavaBean对象的属性值展示在页面中

文章目录参数值自动注入示例代码将JavaBean的属性值显示在页面上示例代码参数值自动注入 注意事项: 1.前端界面的表单项的参数命名格式为:Action属性名.JavaBean的属性名 2.Action的属性必须要有setter/getter方法,注入时会调用setter方法 …

ibmmq 通道命令_IBM MQ常用命令

常用命令创建队列管理器crtmqm –q QMgrName-q是指创建缺省的队列管理器删除队列管理器dltmqm QmgrName启动队列管理器strmqm QmgrName如果是启动默认的队列管理器,可以不带其名字停止队列管理器endmqm QmgrName 受控停止endmqm –i QmgrName 立即停止endmqm –p Qm…

算法运行时间中的对数

【0】README 0.1) source code and text description are from data structure and alg analysis ; 【1】分析算法最混乱的方面大概集中在对数上面, 除分治算法外,可将对数最常出现的规律概括为下列一般法则: 1.1&a…

java项目:永和大王项目_Java项目:书评

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

Struts2+Hibernate项目中的时间和日期问题

文章目录数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期,而不展示时间日期控件日期时间数据展示问题日期时间数据存储问题场景一场景二场景三场景四数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期,而不展示时间 数…

把一个人的特点写具体作文_把一个人的特点写具体作文

把一个人的特点写具体作文在日常学习、工作抑或是生活中,大家都跟作文打过交道吧,写作文可以锻炼我们的独处习惯,让自己的心静下来,思考自己未来的方向。那要怎么写好作文呢?下面是小编为大家整理的把一个人的特点写具…

spring boot简介_Spring Boot简介

spring boot简介在本教程中,我们将看一下Spring Boot,看看它与Spring框架有何不同。 我们还将讨论Spring Boot提供的各种功能。 什么是Spring Boot? 在开发企业级应用程序时,Spring是一个功能强大的框架。 它为我们提供了诸如依赖…

C语言的运算符的优先级与结合性+ASCII表

【0】README 0.1) 内容来源于 C程序设计语言, 旨在整理出C语言的运算符的优先级与结合性, 如下图所示(哥子 记了大半年都没有记住,也是醉了,每次都要去翻); 0.2) 再补充…

退货退款的售后,如何返还金币/有偿优惠券的问题

假设买家购买了3个商品,商品的销售价是10元,商品总金额是30元 买家应付金额是 30 元,买家使用5个金币抵扣5元,买家实付金额是 25 元。 后来买家退货 2 件,怎么退款和退币呢? 要将金币分摊到每个商品上&a…

python orm框架sqlalchemy_python ORM框架:SqlAlchemy

ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等),转而直接使用对象模…

javadoc提取工具_使JavaDoc保持最新状态的工具

javadoc提取工具在许多项目中,文档不是最新的。 更改代码后,很容易忘记更改文档。 原因是可以理解的。 在代码中进行更改,然后进行调试,然后希望在测试中进行更改(或者,如果您使用的是更多TDD,则…