状态模式

状态模式的概念

状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。

对象会将所有与状态相关的行为封装到单独的类中,称为状态类。这样,对象的行为会根据其内部状态的变化而变化,而无需在对象中编写大量的条件语句。

状态模式的作用

封装状态相关的行为:将与特定状态相关的行为封装到单独的状态类中,使代码更加清晰和易于维护。
简化条件逻辑:避免在对象中编写大量的条件语句来处理不同状态下的行为,减少代码的复杂性。
增强扩展性:可以轻松地添加新的状态类,而无需修改现有代码,符合开闭原则。

状态模式的应用场景

对象的行为依赖于其内部状态:例如,订单系统中,订单的状态(待支付、已支付、已发货、已完成)会影响其可执行的操作。
对象需要根据其状态执行不同的行为:例如,交通信号灯的状态(红灯、黄灯、绿灯)决定了车辆的行为。
对象的状态转换逻辑复杂:状态模式可以将状态转换逻辑封装在状态类中,使状态转换更加清晰和易于管理。

Go 语言编写的状态模式示例

以下是一个简单的状态模式示例,模拟一个简单的电梯系统,电梯有三种状态:停止、运行和开门。

package main

import (
	"fmt"
)

// 1. State 接口定义了状态的行为
type State interface {
	DoAction(context *Context)
}

// 2. Context 结构体持有当前状态
type Context struct {
	state State
}
// 2.1 SetState 方法用于设置当前状态
func (c *Context) SetState(state State) {
	c.state = state
}
// 2.2 DoAction 方法用于执行当前状态的行为
func (c *Context) DoAction() {
	c.state.DoAction(c)
}

// 3. StoppedState 结构体表示停止状态
type StoppedState struct{}
// 3.1 DoAction 方法实现了停止状态的行为
func (s *StoppedState) DoAction(context *Context) {
	fmt.Println("Elevator is stopped.")
	context.SetState(&RunningState{})
}

// 4. RunningState 结构体表示运行状态
type RunningState struct{}
// 4.2 DoAction 方法实现了运行状态的行为
func (s *RunningState) DoAction(context *Context) {
	fmt.Println("Elevator is running.")
	context.SetState(&OpenedState{})
}

// 5. OpenedState 结构体表示开门状态
type OpenedState struct{}
// DoAction 方法实现了开门状态的行为
func (s *OpenedState) DoAction(context *Context) {
	fmt.Println("Elevator doors are opened.")
	context.SetState(&StoppedState{})
}

func main() {
	context := &Context{}
	context.SetState(&StoppedState{})

	context.DoAction() // 输出: Elevator is stopped.
	context.DoAction() // 输出: Elevator is running.
	context.DoAction() // 输出: Elevator doors are opened.
	context.DoAction() // 输出: Elevator is stopped.
}