【设计模式】第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()
	}
}
相关推荐
前端不太难12 分钟前
智能体可信之路:全链路安全防御
安全·状态模式·openclaw
智算菩萨2 小时前
【Tkinter】4 Tkinter Entry 输入框控件深度解析:数据验证、密码输入与现代表单设计实战
python·ui·tkinter·数据验证·entry·输入框
大数据新鸟5 小时前
设计模式详解——观察者模式
观察者模式·设计模式
今天也要学习吖5 小时前
开源AI智能客服系统AI-CS
人工智能·ui·chatgpt·golang·开源·gemini·智能客服系统
武藤一雄7 小时前
C# 设计模式大全(第一弹|7种)
microsoft·设计模式·微软·c#·.net·.netcore
多看书少吃饭9 小时前
Vue3 + Java + Python 打造企业级大模型知识库(含 SSE 流式对话完整源码)
java·python·状态模式
UI设计兰亭妙微9 小时前
兰亭妙微原创解读:《术与道》——移动应用UI设计的体系化知识框架
ui·b端界面设计·ui设计公司
互联网散修9 小时前
鸿蒙应用开发UI基础第三十四节:媒体查询核心解析 —— 响应式布局与工具类封装
ui·harmonyos·媒体查询
Aloha_up9 小时前
常见设计模式简介
设计模式
baivfhpwxf20239 小时前
DataGrid 中增加选择列 功能实现
ui·wpf