在状态模式中,有三个主要的角色:
- Context(上下文):它是包含状态的对象,它可以根据其内部状态的改变来改变行为。
- State(状态):它定义了一个接口或抽象类,用于封装与上下文相关的行为。
- Concrete State(具体状态):它实现了状态接口,定义了与特定状态相关的行为。
状态模式的核心思想是将不同的状态封装成独立的类,每个类负责处理特定状态下的行为。上下文对象根据当前的状态调用相应的方法,从而实现状态的切换。
状态模式的优点包括:
- 将状态相关的行为局部化,使得状态转换更加清晰和可控。
- 使得状态类的变化独立于上下文对象,可以方便地增加新的状态类。
- 遵循开闭原则,新增状态不会修改现有的状态类。
然而,状态模式也有一些缺点:
- 当状态较多且复杂时,会增加类的数量。
- 状态之间的转换逻辑可能会变得复杂。
package main
import "fmt"
// State 接口定义了电梯状态的行为
type State interface {
Open()
Close()
Run()
Stop()
}
// OpenState 表示电梯开门状态
type OpenState struct{}
func (s *OpenState) Open() {
fmt.Println("电梯门已经打开")
}
func (s *OpenState) Close() {
fmt.Println("电梯门关闭")
}
func (s *OpenState) Run() {
fmt.Println("电梯开始运行")
}
func (s *OpenState) Stop() {
fmt.Println("电梯停止运行")
}
// CloseState 表示电梯关门状态
type CloseState struct{}
func (s *CloseState) Open() {
fmt.Println("电梯门打开")
}
func (s *CloseState) Close() {
fmt.Println("电梯门已经关闭")
}
func (s *CloseState) Run() {
fmt.Println("电梯开始运行")
}
func (s *CloseState) Stop() {
fmt.Println("电梯停止运行")
}
// Elevator 表示电梯对象
type Elevator struct {
state State
}
func (e *Elevator) SetState(state State) {
e.state = state
}
func (e *Elevator) Open() {
e.state.Open()
}
func (e *Elevator) Close() {
e.state.Close()
}
func (e *Elevator) Run() {
e.state.Run()
}
func (e *Elevator) Stop() {
e.state.Stop()
}
func main() {
elevator := &Elevator{}
// 设置初始状态为关门状态
elevator.SetState(&CloseState{})
// 执行电梯操作
elevator.Open()
elevator.Close()
elevator.Run()
elevator.Stop()
}