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中的状态设计模式相关推荐
- Java中的状态设计模式–示例教程
状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...
- java 状态设计模式_实例讲解:Java中的状态设计模式
Java中的状态设计模式是一种软件设计模式,当对象的内部状态更改时,该模式允许对象更改其行为.状态设计模式通常用于以下情况:对象取决于其状态,并且在运行期间必须根据其内部状态更改其行为.状态设计模式是 ...
- java 设计模式 示例_Java中的状态设计模式–示例教程
java 设计模式 示例 状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件 ...
- Java中的策略设计模式
策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...
- Java中的Memento设计模式-示例教程
记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 记忆模式用于以这种方式实现该目的,即在对象外部无法访问该对象的已保存状态数据,从而保护了已保 ...
- Java中的策略设计模式-示例教程
策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...
- Java中的生成器设计模式
Java 中的 Builder设计模式是一种创建模式,即用于创建对象,类似于 工厂方法设计模式 ,这也是创建设计模式. 在学习任何设计模式之前,我建议先找出特定设计模式要解决的问题. 众所周知, 必要 ...
- 第80节:Java中的MVC设计模式
第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...
- Java中的命令设计模式
在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间. 发送者对象 ...
最新文章
- OOD沉思录 --- 类和对象的关系 --- 使用关系
- fatal error C1010:unexpected end of file while looking for precompiled header directive报错的解决办法
- Leetcode738. 单调递增的数字[C++题解]:贪心,数学解法
- python PyQt5 QVBoxLayout 垂直布局管理
- nginx ngx_http_proxy_module(反向代理)
- VWware Vsphere 实战记录一、vsphere简介及相关名词介绍
- 读书笔记程序员的自我修养 0
- 超星阅读器pdz文件打印转pdf文件
- java爬取app_Java实现爬虫给App提供数据(Jsoup 网络爬虫)
- 银行java程序员面试题_Java程序员面试题集精选
- BOS 系统 定区关联客户功能实现
- R语言中常用的抽样函数
- 前缀im-,in-,il-,ir-的使用规律
- 微博视频怎么下载?微博视频下载和保存工具
- 《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记3 漫反射与Lambert光照模型
- 添加了validaterequest=false 为什么还是报错
- 高频交易——当期货配对交易加入了止损
- Datastage,Informatica,Kettle
- cygwin安装JohnTheRipper 爬坑
- 微网站中加入一键拨号功能代码
热门文章
- codeforces1301 F. Super Jaber(多源bfs+枚举)
- Codeforces Round #658 (Div. 2)
- 【Trie】【费用流】管道监控(loj 3026)
- 初一模拟赛(4.20)
- 【动态规划】大厅安排 (ssl 1212)
- codeforces gym-101755 I-Guess the Tree 交互题、分治、树的直径
- 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局
- 一道非常棘手的 Java 面试题:i++ 是线程安全的吗
- ssm(Spring+Spring mvc+mybatis)Service层接口——IDeptService
- javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext-dao.xml