【设计模式】第22节:行为型模式之“状态模式”

一、简介

状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。不过,状态机的实现方式有多种,除了状态模式,比较常用的还有分支逻辑法和查表法。该模式允许对象内部状态改变使改变它的行为。

二、适用场景

  • 行为随状态而改变
  • 条件、分支语句的替代者

三、UML类图

四、案例

交通信号灯的红黄绿三色的变化。

go 复制代码
package main

import (
	"fmt"
)

type TrafficLightState interface {
	Handle(trafficLight *TrafficLight)
}

type RedState struct {
	Name string
}

func NewRedState() *RedState {
	return &RedState{Name: "Red"}
}

func (r *RedState) Handle(trafficLight *TrafficLight) {
	fmt.Println("Red light: Stopped")
	trafficLight.SetState(NewGreenState())
}

type YellowState struct {
	Name string
}

func NewYellowState() *YellowState {
	return &YellowState{Name: "Yellow"}
}

func (y *YellowState) Handle(trafficLight *TrafficLight) {
	fmt.Println("Yellow light: Be prepared to stop")
	trafficLight.SetState(NewRedState())
}

type GreenState struct {
	Name string
}

func NewGreenState() *GreenState {
	return &GreenState{Name: "Green"}
}

func (g *GreenState) Handle(trafficLight *TrafficLight) {
	fmt.Println("Green light: Go")
	trafficLight.SetState(NewYellowState())
}

type TrafficLight struct {
	State TrafficLightState
}

func NewTrafficLight() *TrafficLight {
	return &TrafficLight{State: NewRedState()}
}

func (t *TrafficLight) SetState(state TrafficLightState) {
	t.State = state
}

func (t *TrafficLight) Change() {
	t.State.Handle(t)
}

func main() {
	trafficLight := NewTrafficLight()
	for i := 0; i < 10; i++ {
		trafficLight.Change()
	}
}
相关推荐
b***74883 小时前
前端状态系统的时代变革:从本地状态到全局状态,再到智能状态的未来趋势
前端·状态模式
C7211BA10 小时前
GoF提出的经典设计模式
设计模式
willxiao11 小时前
js 单例模式 6 种实现方式
javascript·设计模式
YANshangqian12 小时前
免Adobe Photoshop 2025
ui·adobe·photoshop
SoulRoar.13 小时前
设计模式原理
设计模式
斗鹰一余洛晟14 小时前
Web跨域问题
前端·状态模式
天天进步201514 小时前
【Cradle 源码解析二】由眼入心:LMM 如何“看懂”屏幕与 UI 识别机制
ui
weixin_5214311215 小时前
设计模式一览表
设计模式
米芝鱼15 小时前
Unity自定义按钮
算法·ui·unity·游戏引擎·编辑器扩展
米芝鱼15 小时前
Unity自定义TextImage,鼠标悬浮显示信息
算法·ui·unity·编辑器·游戏引擎·图形渲染