Skip to main content

状态模式

设计模式状态模式About 2 min

状态模式允许对象在其内部状态改变时改变其行为,对象看起来似乎修改了它的类。

20240210164438

状态模式包含下列角色:

  1. 上下文(StateContext):
    上下文是拥有状态的对象。它定义了客户端需要的接口,并维护一个当前状态对象的引用。
  2. 抽象状态角色(State):
    抽象状态通常包含一些操作或方法,这些方法由具体状态类实现。
  3. 具体状态角色(Concrete State):
    是抽象状态角色的实现,每个具体状态对应系统中的一个具体状态值。每个具体状态类都实现了抽象状态接口中定义的方法,并且可以改变环境对象的状态(即上下文的当前状态)。

代码实现

上下文

上下文具有两种状态切换的行为,即startclose两个方法。而且状态切换是由内部的state对象完成的。

public class StateContext {
    private State state;

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void start() {
        this.state.start(this);
    }

    public void close() {
        this.state.close(this);
    }
}

抽象状态

抽象状态中定义了对象状态切换的方法。根据上下文对象可知,需要定义两个状态切换的操作。

public abstract class State {


    public abstract void start(StateContext context);

    public abstract void close(StateContext context);

}


具体状态

由上下文可知,具体状态有两种(startclose)。下面分别为这两个状态定义对应的类,以及实现状态切换的方法。

public class StartState extends State {


    @Override
    public void start(StateContext context) {
        System.out.println("已经处于start状态");
    }

    @Override
    public void close(StateContext context) {
        context.setState(new StopState());
        System.out.println("start切换到close状态");
    }
}

同理可以写出StopState的实现。

public class StopState extends State {
    @Override
    public void start(StateContext context) {
        context.setState(new StartState());
        System.out.println("close切换到start状态");
    }

    @Override
    public void close(StateContext context) {
        System.out.println("已经处于close状态");
    }
}

使用

public class Client {
    public static void main(String[] args) {
        StateContext context = new StateContext();
        context.setState(new StartState());

        context.start();
        context.close();
    }
}

运行结果:

20240210212410

What do you think?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v3.0.0-alpha.10