State设计模式上篇(理论篇)

news/2025/4/3 4:44:00/文章来源:https://www.cnblogs.com/seamount3/p/18229865

State设计模式理论篇

参考了王备战老师的ppt,相当于是一次期末复习总结吧

⭐目标:目前的需求是我所制作的OJ项目在面临代码提交结果以及运行结果时对于其中的各个状态(如:通过!编译失败等等诸多状态进行代码开发时,很容易代码一不小心就写烂了,写到连自己都无法看懂的地步,所以尝试解决)

State适用性

一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

一个操作中含有庞大的多分支语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举量表示。

State模式将每个条件分支放入一个独立的表示状态及其行为的类中。

目前判定可能可行,我们可以将对应判题结果归于对应的状态,而例如说编译失败状态,我们就不用再填装第一个没有通过的测试用例
不过不满足的地方也有,我们的需求主要是根据对应代码沙箱返回结果来赋值对应的代码提交结果

效果

它将与特定状态行为相关的行为局部化,并且将不同状态的行为分割开来。

这一句其实没有给我较大的启发,但是我却想到了另外的一个思路,不妨我也照着对应的金库保安系统抽象出一个提交结果管理员(类),由他们来进行对应的操作,例如说接收到对应的代码沙箱执行结果后,进行对应的操作,根据返回结果的状态修改其自身,同时让其能够拥有对应的状态该操作的能力

UML

State Pattern的参与者:

State:不同状态下所有方法的集合

ConcreteState:具体的不同的状态下的行为,实现了State

Context:(上下文)Context和SafeFrame,Context接口负责规定API,而SafeFrame则是 拥有 具有ConcreteState们的参与者。

更具体的UML

环境类与抽象状态类的作用:

•环境类实际上就是拥有状态的对象,环境类有时候可以充当状态管理器(State Manager)的角色,可以在环境类中对状态进行切换操作,它的实例定义了当前的状态。

•抽象状态类可以是抽象类,也可以是接口,不同状态类就是继承这个父类的不同子类。状态类的产生是由于环境类存在多个状态,同时还满足两个条件:1、这些状态经常需要切换;2、在不同的状态下对象的行为不同。因此可以将不同对象下的行为单独提取出来封装在具体的状态类中,使得环境类对象在其内部状态改变时可以改变它的行为,对象看起来似乎修改了它的类,而实际上是由于切换到不同的具体状态类实现的。由于环境类可以设置为任一具体状态类,因此它针对抽象状态类进行编程,在程序运行时可以将任一具体状态类的对象设置到环境类中,从而使得环境类可以改变内部状态并且改变行为。

启发

Divide and Conquer:分割控制,分体分解。State Pattern利用类表示系统状态,依据状态分解了复杂的系统。OO的核心就是代码的责任分解:单一职责原则。因为任何改动和变化都是致命的,如同刻板印刷一下。

有状态才会有处理,因状态而异的处理。

状态模式允许对象(CONTEXT)在内部状态改变时改变它的行为,对象看起来好像修改了它的类。实际上,我们是在使用组合通过引用不同的状态对象来造成类改变的假象。

Context的客户对于状态对象了解不多,甚至浑然不知。

总结

综合看来是可以的,我们甚至可以结合一下对应的工厂方法来进行生产对应的JudgeRes

2024/6/4号更新下章(尝试落地)

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

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

相关文章

vscode如何添加本地python解释器、解析器 Interpreter?(Python: Select Interpreter),并在vscode运行python代码

先安装python扩展 然后点ctrl+shift+p搜索python:select,选择解析器(或者也可以直接点左下方的) 然后360报毒了,允许通过,然后选择你想要的解释器 然后就好了 20230816 文章目录在VSCode中添加本地Python解释器 Python解释器简介为什么要在VSCode中设置Python解释器如…

红日靶场2

环境搭建 配置ip,web机有两张网卡,我对nat设置为192.168.11.0网段,仅主机为192.168.52.0网段,这三台机子都要改一下ip,官方给出要恢复快照3,恢复的时候有问题,不用恢复没有影响 web机的网络情况如下就可以了在这个目录下启动weblogic服务,以管理员身份运行startWebLogic…

C133 线段树分治 CF1681F Unique Occurrences

视频链接:C133 线段树分治 CF1681F Unique Occurrences_哔哩哔哩_bilibili Unique Occurrences - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Problem - 1681F- Codeforces// 线段树分治 O(nlognlogn) #include <iostream> #include <cstring> #include <al…

P10536 [Opoi 2024] 二十六点 题解

比较直接的做法。 当 \(P_x = 1\) 时显然可以暴力 DP,设 \(f_{x,c}\) 表示 \(x\) 的子树中以 \(c\) 开头的最长不下降子序列的长度。直接转移即可。 \(P_x \neq 1\) 的时候呢?我们发现,所谓“忽略掉这些路径中的第 \(2\) 到第 \(P_x\) 个的点”,代表的就是按照深度转移,大…

数据对标?我搜集了7000+标准数据元分享给你

数据治理工作推进过程中比较关键的一步就是数据标准化,这里的数据标准化是指根据相关规范将数据达成统一技术要求的过程。 我国的主要标准分类包括国家标准、行业标准、地方标准和团体标准、企业标准。我们用的比较多的一般就是国标、行标和企业标准。 一、国家标准 国家标准,…

nrf24L01 check不通过问题分析

下面这段代码是有问题的,使nrf24L01 check不通过。 #include "stm32f10x.h" // Device header#include "spi.h" #include "OLED.h"/****** SPI2引脚连接 ******/ #define PA4_SPI1_NSS GPIO_Pin_4 #define PA5_SPI1_SCK GPIO_Pin_5 #define PA6…

Tiger Lowcode 低代码开发平台、Web前端设计器、LowcodeCore 快速构建API

最近发现一款非常好用的低代码开发平台:Tiger 低代码开发平台:http://www.tigerlowcode.com “Tiger 低代码平台”分为:“Web设计器”和“API设计器”两个部分。“Web设计器”是一个基于“CSS/Jquery/HTML”,用于实现“拖拉拽,所见即所得”的前端框架。“API设计器”是一个…

6.3数组-- 二分查找

704. 二分查找 力扣题目链接 题意描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素…

jarbas

jarbas主机发现和nmap扫描 nmap -sn 192.168.56.0/24靶机ip:192.168.56.104 nmap -sT --min-rate 10000 192.168.56.104PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 3306/tcp open mysql 8080/tcp open http-proxynmap -sT -sV -sC -O -p22,80,3306,808…

纷乱繁杂的声明文件

费脑子的声明文件 初始化项目: # 创建项目目录 mkdir hello && cd hello # 生成 package.json npm init -y # 由于是 ts 项目,安装 typescript 包 npm i --save-dev typescript # 生成 tsconfig.json npx tsc --initpackage.json {"name": "@kaoniqiwa…

面试必会-Redis篇

01- 你们项目中哪里用到了Redis ? 在我们的项目中很多地方都用到了Redis , Redis在我们的项目中主要有三个作用 :使用Redis做热点数据缓存/接口数据缓存 使用Redis存储一些业务数据 , 例如 : 验证码 , 用户信息 , 用户行为数据 , 数据计算结果 , 排行榜数据等 使用Redis实现分…