首页 > 其他分享 >State设计模式上篇(理论篇)

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

时间:2024-06-03 22:55:05浏览次数:33  
标签:状态 代码 对象 理论 State 设计模式 行为 对应

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号更新下章(尝试落地)

标签:状态,代码,对象,理论,State,设计模式,行为,对应
From: https://www.cnblogs.com/seamount3/p/18229865

相关文章

  • 23种设计模式之外观模式
    外观模式1、定义外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更容易使用。2、外观模式结构Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关子系统的功能和责任;在正常情况下,它将所有从客户端发......
  • Flink状态State | 大数据技术
    ⭐简单说两句⭐✨正在努力的小叮当~......
  • 设计模式理解
    1.简单工厂模式:就是在一个单例里面通过传入的值创建不同的对象classModuleFactory{publicstaticModuleCreateModuel(ModuleTypetype){switch(type){caseModuleType.A:retur......
  • 设计模式学习(二)工厂模式——工厂方法模式+注册表
    目录工厂方法模式的瑕疵注册表工厂方法模式的瑕疵在前一篇笔记中我们介绍了工厂方法模式,示例的类图如下:考虑一种情况:现在要在程序运行时,根据外部资源,动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过程中,就需要加以判断。例如,在我的例......
  • c/c++设计模式---享元模式
    引入享元模式:围棋游戏:namespace_nmsp1{enumEnumColor//棋子类型{Black,//黑White//白};structPosition//棋子位置{intm_x;intm_y;Position(inttmpx,inttmpy):m_x(tmpx),m_y(tmpy){}......
  • 常用设计模式总结,附完整图解
    UML类图类图定义规则属性和方法前加上(+、-、#、留空)分别代表:公开(public)、私有(private)、保护(protected)、缺省(default)方法括号内为参数类型,冒号后为返回值类型下划线表示静态(static),斜体表示抽象(abstract) 类图关系表示法其中关联、聚合、组合,比较容易混淆,它们的区别:关......
  • 信号量(Semaphore),事件Event(了解),队列补充,进程池和线程池(重点),协程理论,Greenlet,Gevent模
    Ⅰ信号量(Semaphore)【一】什么是信号量信号量Semahpore(同线程一样)互斥锁:允许在同一时刻只能有一个线程或进程同资源进行修改信号量:允许指定数量的进程或线程对资源进行修改【二】例子比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去......
  • Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式 (尼恩)电子版百度云
    书获取链接:python33  。c o  m我的阅读笔记:多线程:介绍Java多线程的基础概念,如线程的创建、启动、状态转换、线程间通信等。锁:深入探讨Java中的各种锁机制,包括内置锁(synchronized)、ReentrantLock、ReadWriteLock等,以及它们的使用场景和性能特点。Java内存模型(JMM):解释J......
  • 设计模式之原型模式
    问题背景在开发一个图形设计软件时,我们面临一个常见的需求:用户需要频繁地创建和编辑各种图形,如圆形、矩形和多边形。其中,许多图形元素在属性上非常相似,比如颜色、大小或样式可能只有细微的差别。用户希望能够快速复制一个已有图形,然后对其进行小的修改,而不是每次都从零开始......
  • day46 完全背包理论基础 518. 零钱兑换 II 377. 组合总和 Ⅳ
    完全背包理论基础有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。而完全......