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

news2025/7/28 6:04:23

一、简介

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

二、适用场景

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

三、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.coloradmin.cn/o/1156512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【NI-DAQmx入门】计数器

1.计数器的作用 NI产品的计数器一般来说兼容TTL信号&#xff0c;定义如下&#xff1a;0-0.8V为逻辑低电平&#xff0c;2~5V为高电平&#xff0c;0.8-2V为高阻态&#xff0c;最大上升下降时间为50ns。 计数器可以感测上升沿&#xff08;从逻辑低到逻辑高的转变&#xff09;和下降…

【电源专题】POE连接方式与功率等级划分

在文章【电源专题】什么是POE&#xff1f;中我们讲到了&#xff1a;PoE&#xff08;Power over Ethernet&#xff09;是指通过网线传输电力的一种技术&#xff0c;借助现有以太网口通过网线同时为终端设备&#xff08;如&#xff1a;IP电话、AP、IP摄像头等&#xff09;进行数据…

web:[GYCTF2020]Blacklist

题目 点开靶机&#xff0c;页面显示为 查看源码 没有其他线索 先提交1试一下 猜测是sql注入&#xff0c;先测试 同时注意到url 提交为3-1&#xff0c;发现页面回显为空白 可以判断为字符型注入 输入select&#xff0c;看是否存在回显 回显了黑名单限制的关键字 但是发现没有…

第五章 I/O管理 九、磁盘的结构

目录 一、概念 二、磁盘的物理地址 1、定义&#xff1a; 2、图像&#xff1a; 如何读取一个“块”&#xff1a; 三、磁盘的分类 四、总结 一、概念 磁盘是由多个盘片和读写磁头组成的&#xff0c;每个盘片都有自己的读写磁头。盘片表面被划分成许多同心圆的磁道&#xff…

并发编程-CPU缓存架构详解 Disruptor的高性能设计方案

1.CPU缓存架构详解 1.1 CPU高速缓存概念 CPU缓存即高速缓冲存储器&#xff0c;是位于CPU与主内存间的一种容量较小但速度很高的存储器。CPU高 速缓存可以分为一级缓存&#xff0c;二级缓存&#xff0c;部分高端CPU还具有三级缓存&#xff0c;每一级缓存中所储存的全部数 据都…

深入了解 RocketMQ:高性能消息中间件

二、RocketMQ基本概念 2.1 消息模型&#xff08;Message Model&#xff09; RocketMQ主要由Producer、Broker、Consumer三部分组成&#xff0c;其中Producer负责生产消息&#xff0c;Consumer负责消费消息&#xff0c;Broker负责存储消息。Broker在实际部署过程中对应一台服务…

硬件知识积累 RS422接口

1. RS422 基本介绍 EIA-422&#xff08;过去称为RS-422&#xff09;是一系列的规定采用4线&#xff0c;全双工&#xff0c;差分传输&#xff0c;多点通信的数据传输协议。它采用平衡传输采用单向/非可逆&#xff0c;有使能端或没有使能端的传输线。和RS-485不同的是EIA-422不允…

高精度5米分辨率DEM数字高程数据

​5米分辨率DEM/DSM(无控)&#xff0c;以多颗高分辨率卫星数据为原始数据&#xff0c;基于智能立体模型构建与点云密集匹配&#xff0c;利用网络分布式与多核并行计算技术&#xff0c;三维点云融合与地形提取技术&#xff0c;辅以智能化的人机交互编辑等手段&#xff0c;处理和…

Android开发知识学习——Kotlin基础

函数声明 声明函数要用用 fun 关键字&#xff0c;就像声明类要用 class 关键字一样 「函数参数」的「参数类型」是在「参数名」的右边 函数的「返回值」在「函数参数」右边使用 : 分隔&#xff0c;没有返回值时可以省略 声明没有返回值的函数&#xff1a; fun main(){println…

阿里云发布通义千问2.0,性能超GPT-3.5,加速追赶GPT-4

10月31日&#xff0c;阿里云正式发布千亿级参数大模型通义千问2.0。在10个权威测评中&#xff0c;通义千问2.0综合性能超过GPT-3.5&#xff0c;正在加速追赶GPT-4。当天&#xff0c;通义千问APP在各大手机应用市场正式上线&#xff0c;所有人都可通过APP直接体验最新模型能力。…

聊一聊B端产品和C端产品的区别

To C 和 To B 的产品究竟有什么区别&#xff1f;难道仅仅只是使用对象和买单者不一样嘛&#xff1f;刚入行的产品经理是不是傻傻分不清楚&#xff1f;做产品经理这么久的你是否思考过这个问题&#xff1f; 作为一名产品经理&#xff0c;也设计过To B 和 To C的产品&#xff0c…

13年测试老鸟,软件测试经验总结分享,这几年你走了多少坑...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试阶段划分 …

个性化医疗:数字孪生的未来之路

数字孪生技术已经成为医疗领域的一项重要创新&#xff0c;为医疗保障提供了全新的可能性。它基于数学、物理和计算机科学原理&#xff0c;通过创建数字化模型和仿真来模拟生物系统和医疗设备。 1. 个性化治疗 数字孪生技术可创建患者的个性化模型&#xff0c;以更好地了解疾病…

Python 自动化(十六)静态文件处理

准备工作 将不同day下的代码分目录管理&#xff0c;方便后续复习查阅 (testenv) [rootlocalhost projects]# ls day01 day02 (testenv) [rootlocalhost projects]# mkdir day03 (testenv) [rootlocalhost projects]# cd day03 (testenv) [rootlocalhost day03]# django-admi…

C语言 每日一题 day9

求最大值及其下标 本题要求编写程序&#xff0c;找出给定的n个数中的最大值及其对应的最小下标&#xff08;下标从0开始&#xff09;。 输入格式 : 输入在第一行中给出一个正整数n&#xff08;1 < n≤10&#xff09;。第二行输入n个整数&#xff0c;用空格分开。 输出格式 …

Nodejs和npm的使用方法和教程

Nodejs简介 Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它几乎是任何类型项目的流行工具&#xff01; &#xff08; 运行环境&#xff0c;是不是很熟悉&#xff0c;对。就是 java JRE&#xff0c;Java 运行时环境&#xff09; Node.js 在浏览器之外运行 V8 Java…

2023 CSP-J题解

T1 小苹果 题目描述 理论分析 对于第一问&#xff0c;我们按照题意模拟每天取走的是多少个苹果即可。由于每天可以取走原来的,数据范围没次会降低到&#xff0c;也就是说这样的过程的时间复杂度可以用下式表示&#xff1a; 对于本题的数据范围n<1e9&#xff0c;这个时间复杂…

PHP/MySQL开发本地服务器软件 MAMP Pro for Mac

MAMP Pro是一款专为Mac用户设计的全功能本地服务器软件&#xff0c;可以将电脑变成一个完整的Web开发环境。无论个人开发者、网站管理员还是团队协作&#xff0c;MAMP Pro都提供了强大的工具和便捷的管理方式&#xff0c;能够更加高效地构建和测试网站。 MAMP Pro的基本功能包括…

数字IC前端学习笔记:优化的基4布斯编码华莱士树乘法器

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html 本文是对前文设计的乘法器&#xff0c;即基4布斯编码华莱士树乘法器的补充和优化&#xff0c;具体关于基4布斯编码和华莱士树的内容可以从以往的文章中获得。 数字IC前端学习笔记&#xff…

信息系统项目管理师教程 第四版【第11章-项目成本管理-思维导图】

信息系统项目管理师教程 第四版【第11章-项目成本管理-思维导图】 课本里章节里所有蓝色字体的思维导图