Skip to content

状态模式的核心思想是将对象的状态分离为独立的状态类,每个状态类负责实现与该状态相关的行为。

对象通过持有当前状态的引用来改变其行为,这样可以简化对象的状态管理,并提高代码的可维护性。

  • 上下文(Context):持有当前状态的对象,负责管理状态并提供状态切换的接口。
  • 状态接口(State Interface):定义了所有具体状态的共同行为的接口。
  • 具体状态类(Concrete State Classes):实现状态接口,封装与特定状态相关的行为。
js
// 状态接口
class ElevatorState {
  enterState(elevator) {
    throw new Error('This method should be overridden!')
  }
}

// 具体状态:电梯停止
class StoppedState extends ElevatorState {
  enterState(elevator) {
    console.log('Elevator is stopped.')
    elevator.setState(this) // 设置当前状态
  }

  request() {
    console.log('Elevator is ready to go.')
  }
}

// 具体状态:电梯运行
class MovingState extends ElevatorState {
  enterState(elevator) {
    console.log('Elevator is moving.')
    elevator.setState(this)
  }

  request() {
    console.log('Elevator is currently moving.')
  }
}

// 上下文:电梯
class Elevator {
  constructor() {
    this.state = new StoppedState() // 初始状态为停止
  }

  setState(state) {
    this.state = state // 切换状态
  }

  request() {
    this.state.request() // 执行当前状态的请求
  }
}

// 客户端代码
const elevator = new Elevator()
elevator.request() // 输出: Elevator is ready to go.

const movingState = new MovingState()
movingState.enterState(elevator) // 切换到运行状态
elevator.request() // 输出: Elevator is currently moving.