状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。
对象会将所有与状态相关的行为封装到单独的类中,称为状态类。这样,对象的行为会根据其内部状态的变化而变化,而无需在对象中编写大量的条件语句。
封装状态相关的行为:将与特定状态相关的行为封装到单独的状态类中,使代码更加清晰和易于维护。
简化条件逻辑:避免在对象中编写大量的条件语句来处理不同状态下的行为,减少代码的复杂性。
增强扩展性:可以轻松地添加新的状态类,而无需修改现有代码,符合开闭原则。
对象的行为依赖于其内部状态:例如,订单系统中,订单的状态(待支付、已支付、已发货、已完成)会影响其可执行的操作。
对象需要根据其状态执行不同的行为:例如,交通信号灯的状态(红灯、黄灯、绿灯)决定了车辆的行为。
对象的状态转换逻辑复杂:状态模式可以将状态转换逻辑封装在状态类中,使状态转换更加清晰和易于管理。
以下是一个简单的状态模式示例,模拟一个简单的电梯系统,电梯有三种状态:停止、运行和开门。
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.
}