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

代码实现
代码路径:https://github.com/XBoom/DesignPatterns/tree/main/18_State
-
定义一个状态接口
State
,该接口包含了对象在不同状态下可能执行的方法1
2
3
4// State 状态接口
type State interface {
HandleState()
} -
然后,定义一个上下文对象
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()
} -
接着,实现具体的状态结构体,每个状态结构体都实现了
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 | context := &Context{} |
结果
1 | 处理具体状态 A |
应用场景
- 订单状态管理:订单可以处于不同的状态(如待支付、已支付、已发货、已完成等),每个状态下订单的行为和处理方式不同,可以使用状态模式来管理订单的状态转换和行为。
- 交通信号灯控制:交通信号灯可以处于红灯、黄灯和绿灯等不同的状态,每个状态下车辆的行为和规则也不同,可以使用状态模式来控制交通信号灯的状态转换和车辆的行为。
- 游戏角色状态:游戏角色可以处于不同的状态(如正常、受伤、死亡等),每个状态下角色的行为和属性也不同,可以使用状态模式来管理游戏角色的状态和行为
总结
- 单一职责原则。 将与特定状态相关的代码放在单独的类中。
- 开闭原则。 无需修改已有状态类和上下文就能引入新状态。
- 通过消除臃肿的状态机条件语句简化上下文代码。