【设计模式】第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()
	}
}
相关推荐
书院门前细致的苹果2 小时前
设计模式大全:单例、工厂模式、策略模式、责任链模式
设计模式·责任链模式·策略模式
御承扬3 小时前
鸿蒙NDK UI之文本自定义样式
ui·华为·harmonyos·鸿蒙ndk ui
前端不太难3 小时前
HarmonyOS 游戏上线前必做的 7 类极端场景测试
游戏·状态模式·harmonyos
一起养小猫5 小时前
Flutter for OpenHarmony 实战_魔方应用UI设计与交互优化
flutter·ui·交互·harmonyos
光影少年6 小时前
AI 前端 / 高级前端
前端·人工智能·状态模式
智商偏低6 小时前
PostGIS+GeoServer+OpenLayers 数据加载无显示问题排查及自定义坐标系配置文档
状态模式
小王不爱笑1327 小时前
序列化和反序列化
状态模式
程序员Sunday10 小时前
说点不一样的。GPT-5.3 与 Claude Opus 4.6 同时炸场,前端变天了?
前端·gpt·状态模式
BD_Marathon11 小时前
设计模式——依赖倒转原则
java·开发语言·设计模式
BD_Marathon11 小时前
设计模式——里氏替换原则
java·设计模式·里氏替换原则