一、应用场景
-
当一个对象的行为取决于其内部状态,并且需要在运行时根据状态改变其行为时。 -
当一个对象具有大量的状态,并且这些状态之间的转换频繁发生时,使用状态模式可以更好地管理状态切换逻辑。
二、实现方式
-
State(状态):定义了对象的一个状态接口,具体状态类实现该接口来定义状态行为。 -
ConcreteState(具体状态):具体状态类实现了状态接口,定义了在该状态下对象的行为。 -
Context(上下文):上下文类持有一个当前状态对象,并在状态发生改变时切换到新的状态。
// State(状态)public interface ElevatorState {void open();void close();void run();void stop();}// ConcreteState(具体状态)public class OpenState implements ElevatorState {public void open() {System.out.println("电梯门已经打开,无需重复操作");}public void close() {System.out.println("电梯门关闭");}public void run() {System.out.println("电梯开始运行");}public void stop() {System.out.println("电梯停止运行");}}// ConcreteState(具体状态)public class CloseState implements ElevatorState {public void open() {System.out.println("电梯门打开");}public void close() {System.out.println("电梯门已经关闭,无需重复操作");}public void run() {System.out.println("电梯开始运行");}public void stop() {System.out.println("电梯停止运行");}}// Context(上下文)public class Elevator {private ElevatorState currentState;public Elevator() {currentState = new CloseState();}public void setState(ElevatorState state) {currentState = state;}public void open() {currentState.open();}public void close() {currentState.close();}public void run() {currentState.run();}public void stop() {currentState.stop();}}// 示例代码public class Main {public static void main(String[] args) {Elevator elevator = new Elevator();elevator.open();elevator.close();elevator.run();elevator.stop();elevator.setState(new OpenState());elevator.open();elevator.close();}}在上述示例中,ElevatorState是状态接口,定义了电梯的行为方法,具体的状态类OpenState和CloseState实现了该接口,分别定义了在打开和关闭状态下的行为。Elevator类是上下文类,持有当前的状态对象,并在需要时切换到新的状态。
通过调用Elevator的不同方法,可以触发相应状态下的行为。例如,调用open()方法会执行当前状态对象的open()方法。 四、优缺点
优点:
-
将状态与行为封装在不同的状态类中,使得代码结构更清晰,易于扩展和维护。 -
将状态转换逻辑集中在上下文类中,使得状态切换更加灵活和可控。 -
符合开闭原则,当需要增加新的状态时,只需要新增对应的状态类,而不需要修改现有代码。
缺点:
-
增加了类和对象的数量,增加了系统的复杂度。 -
如果状态过多或状态之间的转换逻辑复杂,可能会导致代码冗长和难以维护。
五、总结
·END·
本篇文章来源于微信公众号: 老汉聊技术
微信扫描下方的二维码阅读本文

Comments NOTHING