Java状态设计模式

Java状态设计模式

定义

状态模式是一种行为设计模式,它允许对象在内部状态发生改变时改变其行为。状态模式将与状态相关的行为抽取到独立的状态类中,让原对象将工作委派给这些类的实例,而不是自行进行处理。

对应角色

  • 环境(Context):定义客户端需要的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象处理。
  • 抽象状态(State):定义一个接口,用于封装与环境(Context)的一个特定状态相关的行为。
  • 具体状态(Concrete State):实现抽象状态(State)接口,具体实现与环境(Context)的一个特定状态相关的行为。

优缺点

优点

  • 可以将不同的状态隔离,每个状态都是一个单独的类
  • 可以将各种状态的转换逻辑,分布到状态的子类中,减少相互依赖
  • 增加新状态,操作简单

缺点

  • 如果状态数量比较多,状态类的数量会增加,业务场景系统变得很复杂
  • 如果业务中某个对象由几十上百个状态,就会很复杂,这时就需要对状态进行拆分处理

应用场景

  • 一个对象的行为依赖于它的状态,并且它必须在运行时根据状态改变它的行为。
  • 需要编写大量的条件分支语句来决定一个操作的行为,而且这些条件恰好表示对象的一种状态。
  • 对象存在多个状态,状态可以相互转换,不同状态下,行为不同。

实例

这是一个简单的Java状态设计模式的例子。它定义了一个Context类,一个State接口和两个实现State接口的具体状态类。Context类包含一个State类型的成员变量来表示它当前的状态,并且提供了一个方法来改变状态。

interface State {
    public void doAction(Context context);
}

class StartState implements State {
    public void doAction(Context context) {
        System.out.println("Player is in start state");
        context.setState(this);
    }
    public String toString(){
        return "Start State";
    }
}

class StopState implements State {
    public void doAction(Context context) {
        System.out.println("Player is in stop state");
        context.setState(this);
    }
    public String toString(){
        return "Stop State";
    }
}

class Context {
    private State state;
    public Context(){
        state = null;
    }
    public void setState(State state){
        this.state = state;
    }
    public State getState(){
        return state;
    }
}

public class StatePatternDemo {
    public static void main(String[] args) {
        Context context = new Context();
        StartState startState = new StartState();
        startState.doAction(context);
        System.out.println(context.getState().toString());
        StopState stopState = new StopState();
        stopState.doAction(context);
        System.out.println(context.getState().toString());
    }
}

你可能感兴趣的:(设计模式系列,java,设计模式)