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

《golang设计模式》第三部分·行为型模式-08-状态模式(State)

文章目录

  • 1. 概念
    • 1.1 作用
    • 1.1 角色
    • 1.2 类图
  • 2. 代码示例
    • 2.1 设计
    • 2.2 代码
    • 2.3 类图

1. 概念

1.1 作用

状态(State)指状态对象,用于封装上下文对象的特定状态行为,使得上下文对象在内部状态改变时能够改变其自身的行为。

1.1 角色

  • Context(环境类角色):内部维护一个当前状态实例,并负责具体状态的切换。
  • State(抽象状态角色):
    • 是所有具体状态的抽象接口
    • 它的每一个方法代表了环境类的一种操作
  • ConcreteState(具体状态角色):
    • 每个ConcreteState都代表了环境类的一个状态
    • 它的每一个方法代表了环境类在该状态下的一种行为(环境在不同状态下,同一行为的操作是不同的)

1.2 类图

Context
-state:State
+behavior()
«interface»
State
+Handle(con:Context)
StateA
+Handle(con:Context)
StateB
+Handle(con:Context)
StateC
+Handle(con:Context)

2. 代码示例

2.1 设计

需求

  • 环境有关闭、受限、正常三个状态
  • 环境有查看、评论、发布三种状态
  • 其对应关系如下:
查看评论发布
正常
受限×
关闭×××
  • 定义环境类Context
    • 它依赖了抽象状态(如果状态没有冲突,你也可以写成状态的聚合)
    • 它有一个成员是健康值
    • 它的一个内部方法,用来修改状态(虽然golang没有java对类的权限控制,我们只能这么理解,尽量不在“类之外调用”)
    • 它的一个外部方法,传入健康值同时修改环境状态
  • 定义一个函数,创建环境类(这不是状态模式的重点,仅为了方便实例化)
  • 定义抽象状态State
  • 定义一个具体状态关闭(模拟一个网站的用户状态)
    • 它的View()方法,模式关闭状态用户不能查看
    • 它的Comment()方法,模拟关闭状态用户不能评论
    • 它的Post()方法,模拟关闭状态用户不能发布
  • 定义一个具体状态限制(模拟一个网站的用户状态)
    • 它的View()方法,模式限制状态用户可以查看
    • 它的Comment()方法,模拟限制状态用户可以评论
    • 它的Post()方法,模拟限制状态用户不能发布
  • 定义一个具体状态正常(模拟一个网站的用户状态)
    • 它的View()方法,模式正常状态用户可以查看
    • 它的Comment()方法,模拟正常状态用户可以评论
    • 它的Post()方法,模拟正常状态用户可以发布
  • 调用
    • 实例化一个环境类
    • 执行查看操作
    • 修改环境类健康值
    • 再次执行查看操作

2.2 代码

  • 代码
package mainimport ("fmt"
)// 定义环境类
type Context struct {state       StateHealthValue int
}// 根据环境类健康值修改环境状态
func (c *Context) changeState() {if c.HealthValue <= -10 {c.state = &Close{}} else if c.HealthValue > -10 && c.HealthValue <= 0 {c.state = &Restriction{}} else if c.HealthValue > 0 {c.state = &Normal{}}
}// 设置环境类健康值
func (c *Context) SetHealth(value int) {c.HealthValue = valuec.changeState()
}// 创建环境类
func CreateContext(health int) *Context {a := &Context{HealthValue: health,}a.changeState()return a
}// 定义抽象状态类
type State interface {View()Comment()Post()
}// 定义第一个具体状态
type Close struct{}func (c *Close) View() {fmt.Println("无法查看")
}func (c *Close) Comment() {fmt.Println("不能评论")
}func (c *Close) Post() {fmt.Println("不能发布")
}// 定义第二个具体状态
type Restriction struct{}func (r *Restriction) View() {fmt.Println("查看正常")
}func (r *Restriction) Comment() {fmt.Println("评论正常")
}func (r *Restriction) Post() {fmt.Println("不能发布")
}// 定义第三个具体状态
type Normal struct{}func (n *Normal) View() {fmt.Println("查看正常")
}func (n *Normal) Comment() {fmt.Println("评论正常")
}func (n *Normal) Post() {fmt.Println("发布正常")
}func main() {context := CreateContext(75)context.state.View()fmt.Println("================改变健康值==========")context.SetHealth(-20)context.state.View()
}
  • 输出
查看正常
================改变健康值==========
无法查看

2.3 类图

Context
-state State
+ Int HealthValue
+SetHealth(value int)
-changeState()
«interface»
State
+View()
+Comment()
+Post()
Close
+View()
+Comment()
+Post()
Restriction
+View()
+Comment()
+Post()
Normal
+View()
+Comment()
+Post()

相关文章:

《golang设计模式》第三部分·行为型模式-08-状态模式(State)

文章目录 1. 概念1.1 作用1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概念 1.1 作用 状态&#xff08;State&#xff09;指状态对象&#xff0c;用于封装上下文对象的特定状态行为&#xff0c;使得上下文对象在内部状态改变时能够改变其自身的行为。 1.1 角色…...

tp8 使用rabbitMQ(3)发布/订阅

发布/订阅 当我们想把一个消息&#xff0c;发送给 多个消费者的时候&#xff0c;我们把这种模式叫做发布/订阅模式&#xff0c;比如我们做两个消费者&#xff0c;其中一个消费者把消息写入磁盘中&#xff0c;别一个消费者把消息结果输出到屏幕上&#xff0c;就要用到发布订阅模…...

【nlp】3.4 Transformer论文复现:2. 编码器部分(规范化层、子层连接结构、编码器层)

3.4 Transformer论文复现:2. 编码器部分(规范化层、子层连接结构、编码器层) 2.6 规范化层2.6.1 规范化层的作用2.6.2 规范化层的代码实现2.6.3 规范化层总结2.7 子层连接结构2.7.1 子层连接结构2.7.2 子层连接结构的代码实现2.7.3 子层连接结构总结2.8 编码器层2.8.1 编码器…...

面试:ShardingSphere问题

文章目录 什么是ShardingSphere&#xff0c;它的主要功能是什么&#xff1f;ShardingSphere的核心模块有哪些&#xff1f;他们是如何工作的&#xff1f;ShardingSphere 的读写分离是如何实现的&#xff1f;如何配置ShardingSphere的数据分片策略&#xff1f;ShardingSphere支持…...

NX二次开发UF_CURVE_ask_offset_direction_2 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_offset_direction_2 Defined in: uf_curve.h int UF_CURVE_ask_offset_direction_2(UF_STRING_p_t input_curves, double offset_direction_vector [ 3 ] , double dra…...

【研究中】sql server权限用户设置23.11.26

--更新时间2023.11.26 21&#xff1a;30 负责人&#xff1a;jerrysuse DBAliCMSIF EXISTS (select * from sysobjects where namehkcms_user)--判断是否存在此表DROP TABLE hkcms_user CREATE TABLE hkcms_user (id int primary key identity(1, 1),username char(32) NOT N…...

java多线程一

1、什么是线程 线程&#xff08;Thread&#xff09;是一条程序内部的一条执行流程。 程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 2、什么是多线程 多线程&#xff08;multithreading&#xff09;&#xff0c;是指从软件或者硬件上实现多个线程并发执…...

电脑技巧:电脑常见蓝屏、上不了网等故障及解决办法

目录 一、电脑蓝屏 常见原因1: 病毒木马 常见原因2: 安装了不兼容的软件 二、电脑不能上网 常见原因1: 新装系统无驱动 常见原因2: DNS服务器异常 常见原因3: 硬件问题 三、电脑没声音 常见原因1: 未安装驱动 常见原因2: 硬件故障 四、电脑屏幕不显示 常见原因1: 显…...

大语言模型损失函数详解

我们可以把语言模型分为两类&#xff1a; 自动回归式语言模型&#xff1a;自动回归式语言模型在本质上是单向的&#xff0c;也就是说&#xff0c;它只沿着一个方向阅读句子。正向&#xff08;从左到右&#xff09;预测&#xff1b;反向&#xff08;从右到左&#xff09;预测。…...

Spring Boot 3 集成 Knife4j

基础环境 SpringBoot : 3.0.6 Java: jdk-17.0.5 Maven: 3.6.1依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…...

BetaFlight模块设计之三十六:SoftSerial

BetaFlight模块设计之三十六&#xff1a;SoftSerial 1. 源由2. API接口2.1 openSoftSerial2.2 onSerialRxPinChange2.3 onSerialTimerOverflow2.4 processTxState2.5 processRxState 3. 辅助函数3.1 applyChangedBits3.2 extractAndStoreRxByte3.3 prepareForNextRxByte 4. 总结…...

PC访问华为昇腾开发板的摸索过程

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 最近要折腾华为昇腾开发板&#xff08;官方名称叫&#xff1a;Atlas 200I DK&#xff09;。先是按照官方教程折腾&#xff1a;Atlas200DK环境部署。我发现…...

C++学习之路(六)C++ 实现简单的工具箱系统命令行应用 - 示例代码拆分讲解

简单的工具箱系统示例介绍: 这个示例展示了一个简单的工具箱框架&#xff0c;它涉及了几个关键概念和知识点&#xff1a; 面向对象编程 (OOP)&#xff1a;使用了类和继承的概念。Tool 是一个纯虚类&#xff0c;CalculatorTool 和 FileReaderTool 是其派生类。 多态&#xff1…...

redis运维(十四) hash缓存案例

一 缓存案例 ① 需求 ② 个人理解 策略&#xff1a;不更新缓存&#xff0c;而是删除缓存大部分观点认为&#xff1a;1、做缓存不应该是去更新缓存,而是应该删除缓存2、然后由下个请求去缓存,发现不存在后再读取数据库,写入redis缓存 高并发场景下,到底先更新缓存还是先更…...

Rust UI开发(三):iced如何打开图片(对话框)并在窗口显示图片?

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第三篇&#xff0c;前两篇的链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建…...

网络爬虫(Python:Requests、Beautiful Soup笔记)

网络爬虫&#xff08;Python&#xff1a;Requests、Beautiful Soup笔记&#xff09; 网络协议简要介绍一。OSI参考模型二、TCP/IP参考模型对应关系TCP/IP各层实现的协议应用层传输层网络层 HTTP协议HTTP请求HTTP响应HTTP状态码 Requests&#xff08;Python&#xff09;Requests…...

【Kotlin】内联函数

文章目录 内联函数noinline: 避免参数被内联非局部返回使用标签实现Lambda非局部返回为什么要设计noinline crossinline具体化参数类型 Kotlin中的内联函数之所以被设计出来&#xff0c;主要是为了优化Kotlin支持Lambda表达式之后所带来的开销。然而&#xff0c;在Java中我们似…...

Unity技美35——再URP管线环境下,配置post后期效果插件(post processing)

前两年在我的unity文章第10篇写过&#xff0c;后效滤镜的使用&#xff0c;那时候大部分项目用的还是unity的基础管线&#xff0c;stander管线。 但是现在随着unity的发展&#xff0c;大部分项目都用了URO管线&#xff0c;甚至很多PC端用的都是高效果的HDRP管线&#xff0c;这就…...

Redis:持久化RDB和AOF

目录 概述RDB持久化流程指定备份文件的名称指定备份文件存放的目录触发RDB备份redis.conf 其他一些配置rdb的备份和恢复优缺点停止RDB AOF持久化流程AOF启动/修复/恢复AOF同步频率设置rewrite压缩原理触发机制重写流程no-appendfsync-on-rewrite 优缺点 如何选择 概述 Redis是…...

基于python协同过滤推荐算法的音乐推荐与管理系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Python的协同过滤推荐算法的音乐推荐与管理系统是一个集成了音乐推荐和管理的系统&#xff0c;它使用协同过滤算…...

higress 这个中登才是AI时代的心头好谑

核心摘要&#xff1a;这篇文章能帮你 ?? 1. 彻底搞懂条件分支与循环的适用场景&#xff0c;告别选择困难。 ?? 2. 掌握遍历DOM集合修改属性的标准姿势与性能窍门。 ?? 3. 识别流程控制中的常见“坑”&#xff0c;并学会如何优雅地绕过去。 ?? 主要内容脉络 ?? 一、痛…...

终极Obsidian样式定制指南:5分钟打造个性化知识管理界面

终极Obsidian样式定制指南&#xff1a;5分钟打造个性化知识管理界面 【免费下载链接】obsidian-style-settings A dynamic user interface for adjusting theme, plugin, and snippet CSS variables within Obsidian 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-s…...

Reflection_Summary实战教程:如何构建高效的文本分类与相似度计算系统

Reflection_Summary实战教程&#xff1a;如何构建高效的文本分类与相似度计算系统 【免费下载链接】Reflection_Summary 算法理论基础知识应知应会 项目地址: https://gitcode.com/gh_mirrors/re/Reflection_Summary 文本分类与相似度计算是自然语言处理领域的核心技术&…...

零基础极速上手:10分钟用AI建站工具生成一个企业官网

很多朋友觉得搭建官网是件很“技术”的事&#xff0c;需要懂代码、会设计。其实&#xff0c;在当下的AI时代&#xff0c;哪怕你完全零基础&#xff0c;也能在10分钟内生成一个结构、看着专业的公司官网。这篇教程&#xff0c;我们就用一套通用的方法&#xff0c;带你走一遍从零…...

文墨共鸣:如何用AI理解文字“意思”而不仅仅是“文字”?

文墨共鸣&#xff1a;如何用AI理解文字“意思”而不仅仅是“文字”&#xff1f; 你有没有遇到过这样的情况&#xff1f;两段文字&#xff0c;用词完全不同&#xff0c;但说的却是同一个意思。或者反过来&#xff0c;字面看起来差不多&#xff0c;但想表达的核心观点天差地别。…...

Spring Boot 4.0正式版GA后72小时内,头部云厂商紧急下架3款旧Agent插件——你的生产集群是否仍在使用已被标记为EOL的Instrumentation库?

第一章&#xff1a;Spring Boot 4.0 Agent-Ready 架构演进与EOL危机全景Spring Boot 4.0 并非官方已发布版本&#xff0c;而是社区与企业级监控、可观测性厂商围绕 Java Agent 深度集成所推动的架构预演范式。其核心驱动力源于 Spring Boot 3.x 的 Jakarta EE 9 迁移完成、Graa…...

EagleEye企业应用指南:内网GPU显存直处理,彻底规避云端数据泄露风险

EagleEye企业应用指南&#xff1a;内网GPU显存直处理&#xff0c;彻底规避云端数据泄露风险 基于 DAMO-YOLO TinyNAS 架构的毫秒级目标检测引擎 1. 为什么企业需要本地化的视觉AI方案&#xff1f; 想象一下这个场景&#xff1a;你的工厂生产线需要实时检测产品缺陷&#xff0c…...

SDMatte Web前端性能优化:大图片上传与预览的流畅体验实现

SDMatte Web前端性能优化&#xff1a;大图片上传与预览的流畅体验实现 1. 引言&#xff1a;大图片处理的用户体验痛点 在图像处理类Web应用中&#xff0c;用户上传大尺寸图片时常常面临几个典型问题&#xff1a;上传速度慢、页面卡顿、预览效果差。以SDMatte这样的智能抠图工…...

OpenClaw任务调度:Qwen3-14b_int4_awq优先级管理策略

OpenClaw任务调度&#xff1a;Qwen3-14b_int4_awq优先级管理策略 1. 为什么需要优先级管理 上周我在本地部署了OpenClaw对接Qwen3-14b_int4_awq模型&#xff0c;准备用它来处理日常的文档整理和代码生成任务。但很快发现一个问题&#xff1a;当我同时提交多个任务时&#xff…...

【箱线图详解】

文章目录一. 什么是箱线图二. 箱线图详解2.1 下界2.2 下四分位数&#xff08;Q1&#xff0c;25%分位数&#xff09;2.3 中位数&#xff08;Q2&#xff0c;50%分位数&#xff09;2.4 上四分位数&#xff08;Q3&#xff0c;75%分位数&#xff09;2.5 上界三. 两个关键概念3.1 四分…...