设计模式-19-状态模式

状态模式是一种行为设计模式, 能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。

逻辑结构

State

代码实现

代码路径:https://github.com/XBoom/DesignPatterns/tree/main/18_State

  1. 定义一个状态接口 State,该接口包含了对象在不同状态下可能执行的方法

    1
    2
    3
    4
    // State 状态接口
    type State interface {
    HandleState()
    }
  2. 然后,定义一个上下文对象 Context,持有当前状态并且可以在不同状态下执行相应的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Context 环境类
    type Context struct {
    state State
    }

    func (c *Context) SetState(state State) {
    c.state = state
    }

    func (c *Context) Request() {
    c.state.HandleState()
    }
  3. 接着,实现具体的状态结构体,每个状态结构体都实现了 State 接口中定义的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // ConcreteStateA 具体状态 A
    type ConcreteStateA struct{}

    func (s *ConcreteStateA) HandleState() {
    fmt.Println("处理具体状态 A")
    }

    // ConcreteStateB 具体状态 B
    type ConcreteStateB struct{}

    func (s *ConcreteStateB) HandleState() {
    fmt.Println("处理具体状态 B")
    }

运行

1
2
3
4
5
6
7
8
9
context := &Context{}

stateA := &ConcreteStateA{}
context.SetState(stateA)
context.Request() // Output: 处理具体状态 A

stateB := &ConcreteStateB{}
context.SetState(stateB)
context.Request() // Output: 处理具体状态 B

结果

1
2
处理具体状态 A
处理具体状态 B

应用场景

  • 订单状态管理:订单可以处于不同的状态(如待支付、已支付、已发货、已完成等),每个状态下订单的行为和处理方式不同,可以使用状态模式来管理订单的状态转换和行为。
  • 交通信号灯控制:交通信号灯可以处于红灯、黄灯和绿灯等不同的状态,每个状态下车辆的行为和规则也不同,可以使用状态模式来控制交通信号灯的状态转换和车辆的行为。
  • 游戏角色状态:游戏角色可以处于不同的状态(如正常、受伤、死亡等),每个状态下角色的行为和属性也不同,可以使用状态模式来管理游戏角色的状态和行为

总结

  • 单一职责原则。 将与特定状态相关的代码放在单独的类中。
  • 开闭原则。 无需修改已有状态类和上下文就能引入新状态。
  • 通过消除臃肿的状态机条件语句简化上下文代码。

参考链接

  1. https://refactoringguru.cn/design-patterns/state
  2. https://lailin.xyz/post/state.html