当前位置: 首页 > news >正文

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

一、简介

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

二、适用场景

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

三、UML类图

请添加图片描述

四、案例

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

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()
	}
}
http://www.dtcms.com/a/3490.html

相关文章:

  • MySQL user权限表详解
  • Vue使用Object.definedproperty的数据监听 使用js实现一种发布订阅的模式
  • 领星ERP如何无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统
  • 华锐技术何志东:证券核心交易系统分布式改造将迎来规模化落地阶段
  • docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)
  • 基于MIMO通信系统的球形译码算法matlab性能仿真,对比PSK检测,SDR检测
  • 【文生图】Stable Diffusion XL 1.0模型Full Fine-tuning指南(U-Net全参微调)
  • 一文带你轻松拿下Java中的抽象类
  • 目标检测:Proposal-Contrastive Pretraining for Object Detection from Fewer Data
  • 家庭用洗地机哪个最好?家用洗地机选购
  • SPSS游程检验
  • AHD摄像头和普通摄像头
  • 【地理位置识别】IP归属地应用的特点
  • 二十、泛型(1)
  • 设计交换机原理图前应先理清的框图
  • 清华大学利用可解释机器学习,优化光阳极催化剂,助力光解水制氢
  • c++中httplib使用
  • SpringBoot----自定义Start(自定义依赖)
  • 用前端框架Bootstrap的AdminLTE模板和Django实现后台首页的页面
  • Java判断是否有特殊字符串
  • PC应用管理工具 连接流程图 支持所有android手机或设备 批量设备批量应用安装卸载等管理 OS升级 push文件夹等
  • 分体式离子风刀和整体式离子风刀分别有哪些优缺点
  • Linux虚拟网络设备之tun/tap和veth设备的特点
  • java对象的创建过程
  • AI开源 - LangChain UI 之 Flowise
  • 贪心算法学习------优势洗牌
  • 请一个折腾了5个月AI绘画的人来讲讲GPU选择的经验,没入坑的看他这一篇就足够了
  • 婚姻管理系统-使用bbst数据结构
  • Python中文件copy模块shutil
  • JumpServer开源堡垒机与万里安全数据库完成兼容性认证