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设计模式之状态模式_Java中的状态设计模式相关推荐

  1. java memento_memento模式_Java中的Memento设计模式-示例教程

    memento模式 记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 使用Memento模式以这种方式实现该目的,即无法在对象外部访问对象的已 ...

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

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

  3. java命令模式_Java中的命令设计模式

    java命令模式 在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象 ...

  4. java设计模式 订阅模式_Java中的复合设计模式

    java设计模式 订阅模式 当我们必须使用对象的树状分层结构时,复合设计模式非常有用. 它使我们能够统一对待单个对象和对象组成. 它属于结构设计模式的范畴,因为它将对象组合成树形结构以表示部分整个层次 ...

  5. java设计模式迭代器模式_Java中的迭代器设计模式–示例教程

    java设计模式迭代器模式 迭代器模式是一种行为模式,它用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator ...

  6. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  7. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  8. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

  9. java设计模式迭代器模式_Java中的迭代器设计模式

    java设计模式迭代器模式 Iterator design pattern in one of the behavioral pattern. Iterator pattern is used to ...

最新文章

  1. 商汤科技宣布C轮战略融资6亿美元 阿里领投苏宁跟投
  2. Grafana中整个Dashboard报错问题解决
  3. UVA - 489 ​​​​​​​Hangman Judge
  4. Spring事务管理(二)-TransactionProxyFactoryBean原理
  5. mysql建表时创建索引语句_创建表的时候创建索引
  6. 【美赛】2022美赛思路参考资料及其代码分享【全网最全】【美国大学生数学建模竞赛】【MCM/ICM】
  7. c语言简单图形库,C语言图形库简单对比及EGE库的安装小手册
  8. 易接SDK接入:Android手游支付功能接口实现,完整代码奉上
  9. 阿里云与腾讯云的区别对比
  10. flash中zip/unip的实际意图
  11. python饼状图显示其比例_python可视化:matplotlib绘制的饼状图你了解吗?
  12. 关于主机名,域名区别(www.baidu.com与baidu.com)以及同源策略的一些误区
  13. 博士申请 | 美国北卡州立大学郭志山教授招收机器学习方向全奖博士生
  14. MusicFree一款小而美的播放器
  15. fluent柱坐标系设定_Fluent中速度入口条件要设置哪些参数
  16. for循环的执行顺序,i++和++i
  17. php生成水印函数,php使用imagecopymerge()函数创建半透明水印
  18. Fast load times系列翻译——将性能预算合并到构建过程中
  19. CobaltStrike上线微信提醒
  20. java怎么调用另一个类的方法_在一个类中访问另一个类的方法

热门文章

  1. 牛客题霸 [二进制中1的个数] C++题解/答案
  2. CodeForces 1191A---Tokitsukaze and Enhancement
  3. YBTOJ:求好元素(哈希表)
  4. jzoj1402-偷懒的小X【贪心】
  5. 2019纪中暑假游记+总结
  6. jzoj4638-第三条跑道【欧拉函数,线段树】
  7. nssl1192-加密【字符串hash】
  8. BZOJ1251 序列终结者
  9. 2-sat模板- 输出可行解
  10. Java 中的双重检查(Double-Check)