02-状态模式

1 意图

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。(这里的对象指的就是模型中的Context,行为指的就是State的子类)

2 动机

考虑一个问题:实现一个表示网络连接的类TCPConnection,它的对象的状态处于若干不同状态之一:连接已建立(Established)、正在监听(Listening)、连接已关闭(Closed)。当一个TCPConection对象收到其他对象的请求时,他根据自身的状态做出不同的反应。例如,一个Open请求的结果依赖于该连接时处于连接已关闭还是连接已建立的状态。状态模式描述了TCPConnextion如何在每一个状态下表现出不同的行为。

实现方法:关键思想是在TCPConnection引入一个TCPState的抽象类来表示网络连接的状态。TCPState类为各个不同的状态声明了一个(或一套)公共的接口。针对每个状态的行为实现TCPState的子类。例如,TCPEstablished和TCPClosed类分别实现了特定于TCPConnection的连接已建立状态和连接已关闭状态的行为。

TCPConnection
-TCPState tpcState;
open()
acknowledge()
close()
«interface»
TCPState
open()
acknowledge()
close()
TCPOpen
open()
acknowledge()
close()
TCPEstablished
open()
acknowledge()
close()
TCPClosed
open()
acknowledge()
close()

TCPConnection类维护一个表示TCP连接当前状态的状态对象(一个TCPState子类的实例)。TCPConnection类将所有与状态相关的请求委托给这个状态的对象。TCPConnection使用它 的TCPState子类实例来执行特定于连接状态的操作。
一旦连接状态改变,TCPConnection对象就会改表它所使用的状态对象。例如当连接从已建立状态转位已关闭状态时,TCPConnection会用一个TCPClosed的实例来代替原来的TCPConnextion的实例,至于怎么替换,一般是在一个状态结束的时候掉用给TCPConnextion的TCPState变量设置成另外一个状态类实例。

使用场景

  • 对象的行为取决于它的状态。并且它必须在运行的时根据状态改变它的行为。
  • 一个操作中含有大量的多分支的条件语句,并且这些分支依赖于该对象的状态。这个状态通常有一个或者多个枚举常量表示。通常,多个操作包含这一相同的条件结构。State模式将每个条件分支放入一个独立的类中。

结构

Context
-State state
«interface»
State
+operate()
StateA
+operate()
StateB
+operate()
StateC
+operate()

结构和策略模式一摸一样,但实际上实现起来并不一样,策略模式各个子类间可以说是完全独立的,而状态模式各个子类间是紧密关联的,各个状态子类之间组合出一个完整的行为,通常来说他们之间还会互相依赖,因为Context从一个状态到另一个状态的转变时需要在状态子类中实现。

应用

java 中 spring提供的状态机框架Spring Statemachine,就是对状态模式思想的一种实现;还有很多工作流的框架都是基于状态模式实现的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/26813.shtml

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

相关文章

Java课设--学生信息管理系统(例2)

文章目录 前提一、运行效果二、代码获取 前言 首先确定自己的JDBC连接数据库已经完成,不懂可以看看其他博主的解析。 我使用的是SQL Server数据库,数据库名称为stu,账号为sa,密码为123456 数据库的表为student表,内容如下: 一、…

Linux 信号signal处理机制

Signal机制在Linux中是一个非常常用的进程间通信机制,很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断,因此,在实时性方面还是相对比较高的。Linux中signal机制的模型可以采用下图进行描述。 每个进程…

Selenium自动化测试框架的搭建

说 起自动化测试,我想大家都会有个疑问,要不要做自动化测试? 自动化测试给我们带来的收益是否会超出在建设时所投入的成本,这个嘛别说是我,即便是高手也很难回答,自动化测试的初衷是美好的,而测…

.gitkeep介绍

最近在nand flash上创建可读写分区的时候涉及到了.gitkeep,了解了一下。 .gitkeep 文件的作用 .gitkeep 这个文件并不是一个多么复杂 ,相反,它的意图,或者说作用,其实非常简单!就是—使 Git 保留一个空文…

ELK、ELFK日志分析系统

菜单一、ELK简介1.1 ELK组件说明1.1.1 ElasticSearch1.1.2 Kiabana1.1.3 Logstash 1.2 可以添加的其它组件1.2.1 Filebeat1.2.2 缓存/消息队列(redis、kafka、RabbitMQ等)1.2.3 Fluentd 1.3 为什么要用ELK1.4 完整日志系统的基本特征1.5 ELK 的工作原理 …

Linux初识网络基础

目录 网络发展 认识“协议 ” 网络协议 OSI七层模型: TCP/IP五层(或四层)模型 网络传输基本流程 网络传输流程图: 数据包封装和封用 网络中的地址 认识IP地址: 认识MAC地址: 网络发展 1.独立…

【云原生】Docker-compose中所有模块学习

compose模块 模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的。 默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。 version: "3&quo…

STM32单片机蓝牙APP宠物自动喂食器定时语音提醒喂食系统设计

实践制作DIY- GC00162---蓝牙APP宠物自动喂食器 一、功能说明: 基于STM32单片机设计---蓝牙APP宠物自动喂食器 二、功能说明: STM32F103C系列最小系统板LCD1602显示器DS1302时钟模块5个按键语音播报模块ULN2003步进电机模块LED灯板HC-05蓝牙模块&#x…

深入探究性能测试:从原理到实践

引言 在软件开发领域,性能测试是一个关键的环节。它可以帮助开发者评估系统的稳定性和响应能力,找出潜在的性能瓶颈,并为系统的优化提供数据支持。本篇博客将介绍性能测试的基本原理和常用方法,并通过一个实际案例来演示如何编写性能测试代码。 什么是性能测试? 性能测…

检查网站是HTTP那种协议与获取域名的ipv6地址

前言 最近在做HTTPS的应用,可能需要使用ipv6的地址做SLB,但是怎么检查配置正确,总不能每次都看日志吧,实际上客户端也很容易查看,总结工作经验。 检查HTTP协议版本 笔者想到了使用浏览器方式,或者抓包&a…

JS实现节流与防抖

前言:节流和防抖就是为了减少性能开销和提升用户体验而生的,主要优化【接口暴击】【表单重复提交】【搜索框搜索输入】等相关问题; 节流 定义:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才…

如何使用伪元素::before和::after?

伪元素(::before和::after)是CSS中非常有用的特性,它们允许你在元素的内容之前或之后插入额外的内容,并且不需要在HTML结构中添加额外的标记。这样可以方便地在页面上添加装饰性元素、图标、或者样式效果。以下是使用伪元素的基本方法: 1、创…

春秋云镜 CVE-2020-26042

春秋云镜 CVE-2020-26042 Hoosk CMS v1.8.0 存在sql注入漏洞 靶标介绍 Hoosk CMS v1.8.0 install/index.php 存在sql注入漏洞。 启动场景 漏洞利用 SQL注入POC POST /install/index.php HTTP/1.1 Host: xxxx User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; r…

android Native C++打印堆栈

记录一下Android堆栈打印方法,程序运行堆栈在分析代码运行逻辑中非常有用 1.在要打印堆栈的模块中添加libutilscallstack、libutils两个共享库依赖,有可能是Android.mk,也有可能是Android.bp Android.bp: cc_defaults {name: &qu…

如何使用 ChatGPT 规划家居装修

你正在计划家庭装修项目,但不确定从哪里开始?ChatGPT 随时为你提供帮助。从集思广益的设计理念到估算成本,ChatGPT 可以简化你的家居装修规划流程。在本文中,我们将讨论如何使用 ChatGPT 有效地规划家居装修,以便你的项…

Ajax入门

文章目录 axios体验axios-查询参数常用请求方法数据提交 axios错误处理 axios体验 引入axios库 使用axios语法 axios({url: 目标资源地址 }).then((result)>{// 对服务器返回的数据做后续处理 })完整实例 <!DOCTYPE html> <html lang"en"><head&g…

Golang空结构体struct{}的作用是什么?

文章目录 占位符&#xff1a;通道标识&#xff1a;键集合&#xff1a;内存占用优化&#xff1a;总结&#xff1a; 在Go语言中&#xff0c;空结构体 struct{}是一种特殊的数据类型&#xff0c;它不占用任何内存空间。空结构体没有任何字段&#xff0c;也没有任何方法。尽管它看起…

vb+SQL电子教务系统设计与实现

摘 要 电子教务管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面.对于前者要求建立数据一致性和完整性强,数据安全性好的数据库.而对于后者则要求应用程序功能完备,易使用等特点。在学校,教务信息包括教师信息、学生…

Linux文本处理工具和正则表达式

Linux文本处理工具和正则表达式 一.查看、截取和修改文本的工具 1.查看文本的工具 cat 最常用的文件查看命令&#xff1b;当不指明文件或者文件名为一杠’-时&#xff0c;读取标准输入。 cat [OPTION]... [FILE]... -A&#xff1a;显示所有控制符(tab键:^I;行结束符:$) -…

Python web实战之Django的文件上传和处理详解

概要 关键词&#xff1a;Python Web开发、Django、文件上传、文件处理 今天分享一下Django的文件上传和处理。 1. 上传文件的基本原理 在开始深入讲解Django的文件上传和处理之前&#xff0c;先了解一下文件上传的基本原理。当用户选择要上传的文件后&#xff0c;该文件会被发…