在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式。
当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用。 当对象的行为取决于其当前状态时,我们应该主要使用它。 这种模式有助于我们避免在该类的方法中对对象的状态进行长时间的条件检查。
有了它,让我们开始吧!
状态设计模式:
我们可以用以下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