当前位置: 首页 > 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()
	}
}

相关文章:

  • 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判断是否有特殊字符串
  • 上海市长会见保加利亚副总理,以友城合作为纽带,促进中保合作结出硕果
  • 越南前国家主席陈德良因病去世
  • 贵州已设立省地质矿产局、省地质矿产开发院
  • 建行原副行长章更生涉嫌受贿罪、违法发放贷款罪被逮捕
  • 中国建设银行原党委委员、副行长章更生被决定逮捕
  • 媒体谈平台帮商家“拉黑”客户:平台治理需兼顾商家与消费者权益