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

面向对象设计模式:行为型模式之状态模式

文章目录

      • 一、引入
      • 二、状态模式
        • 2.1 Intent 意图
        • 2.2 Applicability 适用性
        • 2.3 类图
        • 2.4 Collaborations 合作
        • 2.5 Implementation 实现
        • 2.5 状态模式与策略模式的对比
        • 2.5 状态模式实例:糖果机
        • 2.6 状态模式实例:自行车升降档

一、引入

  • State Diagram 状态图:
    A state diagram is a type of diagram used in computer science and related fields to describe the behavior of systems.
    状态图是在计算机科学和相关领域中用于描述系统行为的一种图.

在这里插入图片描述
Parts of UML

  • 糖果机问题

在这里插入图片描述

  1. 状态汇总:No Quarter(无 25 美分)、Has Quarter(有 25 美分)、Gumball Sold(糖果售出)、Out Of Gumballs(糖果售罄)attribute value
  2. 行为汇总:insert quarter(投币)、ejects quarter(吐币)、turns crank(转动曲柄)、dispense(出糖果,For machine)method
package net.dp.state.gumball;public class GumballMachine {final static int SOLD_OUT = 0;final static int NO_QUARTER = 1;final static int HAS_QUARTER = 2;final static int SOLD = 3;int state = SOLD_OUT;int count = 0;public GumballMachine(int count) {this.count = count;if (count > 0) {state = NO_QUARTER;}}public void insertQuarter() {if (state == HAS_QUARTER) {System.out.println("You can't insert another quarter");} else if (state == NO_QUARTER) {state = HAS_QUARTER;System.out.println("You inserted a quarter");} else if (state == SOLD_OUT) {System.out.println("You can't insert a quarter, the machine is sold out");} else if (state == SOLD) {System.out.println("Please wait, we're already giving you a gumball");}}public void ejectQuarter() {if (state == HAS_QUARTER) {System.out.println("Quarter returned");state = NO_QUARTER;} else if (state == NO_QUARTER) {System.out.println("You haven't inserted a quarter");} else if (state == SOLD) {System.out.println("Sorry, you already turned the crank");} else if (state == SOLD_OUT) {System.out.println("You can't eject, you haven't inserted a quarter yet");}}public void turnCrank() {if (state == SOLD) {System.out.println("Turning twice doesn't get you another gumball!");} else if (state == NO_QUARTER) {System.out.println("You turned but there's no quarter");} else if (state == SOLD_OUT) {System.out.println("You turned, but there are no gumballs");} else if (state == HAS_QUARTER) {System.out.println("You turned...");state = SOLD;dispense();}}public void dispense() {if (state == SOLD) {System.out.println("A gumball comes rolling out the slot");count = count - 1;if (count == 0) {System.out.println("Oops, out of gumballs!");state = SOLD_OUT;} else {state = NO_QUARTER;}} else if (state == NO_QUARTER) {System.out.println("You need to pay first");} else if (state == SOLD_OUT) {System.out.println("No gumball dispensed");} else if (state == HAS_QUARTER) {System.out.println("No gumball dispensed");}}public void refill(int numGumBalls) {this.count = numGumBalls;state = NO_QUARTER;}public String toString() {StringBuffer result = new StringBuffer();result.append("\nMighty Gumball, Inc.");result.append("\nJava-enabled Standing Gumball Model #2004\n");result.append("Inventory: " + count + " gumball");if (count != 1) {result.append("s");}result.append("\nMachine is ");if (state == SOLD_OUT) {result.append("sold out");} else if (state == NO_QUARTER) {result.append("waiting for quarter");} else if (state == HAS_QUARTER) {result.append("waiting for turn of crank");} else if (state == SOLD) {result.append("delivering a gumball");}result.append("\n");return result.toString();}
}

Terrible implements!

需求变更:

提升销量,10 % 的可能出两个糖果
在这里插入图片描述
在这里插入图片描述
难以维护:
在这里插入图片描述

二、状态模式

2.1 Intent 意图

  • Allow an object to alter its behavior when its internal state changes. The object will appear to change its class. 状态模式允许一个对象在其内部状态改变的时候改变其行为,这个对象看上去就像改变了它的类一样.

2.2 Applicability 适用性

  • An object’s behavior depends on its state, and it must change its behavior at run-time depending on that state. 对象的行为取决于它的状态,它必须根据运行状态改变它的行为.
  • Operations have large, multipart conditional statements that depend on the object’s state. 操作有依赖于对象状态的大量的、多部分的条件语句.

2.3 类图

在这里插入图片描述

  • Context: Defines the interface of interest to clients; maintains an instance of a ConcreteState that defines the current state.
  • State: Defines an interface for encapsulating the behavior associated with a particular state of the Context.
  • ConcreteState: each implements a behavior associated with a state of the Context.

2.4 Collaborations 合作

  • Context delegates state-specific requests to the current ConcreteState object. Context 把状态相关的请求代理到当前的 ConcreteState 对象。
  • A context may pass itself as an argument to the State object handling the request. This lets the State object access the context if necessary. context 可以将自身作为参数传递给处理该请求的状态对象,以允许状态对象在必要时访问上下文。
  • Context is the primary interface for clients. State objects can be configured to context. Once a context is configured, its clients don’t have to deal with the State objects directly. Context 是 Client 的主要接口,状态对象可以配置到 context,并且一旦配置了状态,Client 就不必直接处理状态对象了。
  • Either Context or the ConcreteState can decide which state succeeds another and under what circumstances. Context 或 ConcreateState 均能决定 state 的后继状态是哪个以及在什么条件下(状态的变化如何)

2.5 Implementation 实现

  • Who defines the state transitions? 谁定义状态转换

    • The State pattern does not specify which participant defines the criteria for state transitions. 状态模式并不指定哪个参与者(Context、State)定义了状态转换的标准.
    • If the criteria are fixed, then they can be implemented entirely in the Context. 如果转换标准是固定的,那么它们就可以完全在 Context 中实现.
    • It is generally more flexible and appropriate to let the State subclasses themselves specify their successor state and when to make the transition. 通常,让状态子类本身指定它们的后继状态以及何时进行转换更加灵活和合适.
      • It is easy to modify or extend the logic by defining new State subclasses. 易于通过定义新 State 子类修改或扩展逻辑
      • A disadvantage is State subclass will have knowledge of at least one other, which introduces implementation dependencies between subclasses. 一个缺点是状态子类至少知道一个其他子类,这就引入了子类之间的实现依赖关系。
  • Creating and destroying State objects. 创建与销毁状态对象

    • Lazy: to create State objects only when they are needed and destroy them thereafter. 只在需要状态对象时创建状态对象,并在此之后销毁它们
      • When the states that will be entered aren’t known at runtime, and contexts change state infrequently. 当运行时不知道将输入的状态,且上下文 contexts 很少改变状态时.
    • Eager: creating them ahead of time and never destroying them. 提前创造出它们,但从不摧毁它们
      • When state changes occur rapidly. 状态改变频繁时

2.5 状态模式与策略模式的对比

  • Same:类图基本一致
  • Diff
    • Strategy: One state with many algorithms
      • 一个具有多个算法实现的抽象状态,采用哪个由 Client 决定
    • State: many States with different behaviors - 多个 具有不同行为的状态,一个状态对应一个行为
      • 采用哪个可以由 Client 决定,且运行过程中状态可以改变,从而行为也得到改变

状态模式与策略模式很相似,状态是将类的"状态"封装了起来,在执行动作时进行自动的转换,从而实现类在不同状态下的同一动作显示出不同结果。
它与策略模式的区别在于,这种转换是"自动","无意识"的。

关于策略模式:https://blog.csdn.net/qq_44992559/article/details/115007554

2.5 状态模式实例:糖果机

变更需求实现

  • 糖果机:即 Context
public class GumballMachine {State soldOutState;State noQuarterState;State hasQuarterState;State soldState;State winnerState;State state = soldOutState;int count = 0;public GumballMachine(int numberGumballs) {soldOutState = new SoldOutState(this);noQuarterState = new NoQuarterState(this);hasQuarterState = new HasQuarterState(this);soldState = new SoldState(this);winnerState = new WinnerState(this);this.count = numberGumballs;if (numberGumballs > 0) {state = noQuarterState;} }public void insertQuarter() {state.insertQuarter();}public void ejectQuarter() {state.ejectQuarter();}public void turnCrank() {state.turnCrank();state.dispense();}void setState(State state) {this.state = state;}void releaseBall() {System.out.println("A gumball comes rolling out the slot...");if (count != 0) {count = count - 1;}}int getCount() {return count;}void refill(int count) {this.count = count;state = noQuarterState;}public State getState() {return state;}public State getSoldOutState() {return soldOutState;}public State getNoQuarterState() {return noQuarterState;}public State getHasQuarterState() {return hasQuarterState;}public State getSoldState() {return soldState;}public State getWinnerState() {return winnerState;}public String toString() {StringBuffer result = new StringBuffer();result.append("\nMighty Gumball, Inc.");result.append("\nJava-enabled Standing Gumball Model #2004");result.append("\nInventory: " + count + " gumball");if (count != 1) {result.append("s");}result.append("\n");result.append("Machine is " + state + "\n");return result.toString();}
}
  • 糖果机状态接口:抽象状态
public interface State {public void insertQuarter();public void ejectQuarter();public void turnCrank();public void dispense();
}
  • 有 25 美分硬币状态
public class HasQuarterState implements State {Random randomWinner = new Random(System.currentTimeMillis());GumballMachine gumballMachine;public HasQuarterState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}public void insertQuarter() {System.out.println("You can't insert another quarter");}public void ejectQuarter() {System.out.println("Quarter returned");gumballMachine.setState(gumballMachine.getNoQuarterState());}public void turnCrank() {System.out.println("You turned...");int winner = randomWinner.nextInt(10);if ((winner == 0) && (gumballMachine.getCount() > 1)) {gumballMachine.setState(gumballMachine.getWinnerState());} else {gumballMachine.setState(gumballMachine.getSoldState());}}public void dispense() {System.out.println("No gumball dispensed");}public String toString() {return "waiting for turn of crank";}
}
  • 无 25 美分硬币状态
public class NoQuarterState implements State {GumballMachine gumballMachine;public NoQuarterState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}public void insertQuarter() {System.out.println("You inserted a quarter");gumballMachine.setState(gumballMachine.getHasQuarterState());}public void ejectQuarter() {System.out.println("You haven't inserted a quarter");}public void turnCrank() {System.out.println("You turned, but there's no quarter");}public void dispense() {System.out.println("You need to pay first");} public String toString() {return "waiting for quarter";}
}
  • 售罄状态
public class SoldOutState implements State {GumballMachine gumballMachine;public SoldOutState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}public void insertQuarter() {System.out.println("You can't insert a quarter, the machine is sold out");}public void ejectQuarter() {System.out.println("You can't eject, you haven't inserted a quarter yet");}public void turnCrank() {System.out.println("You turned, but there are no gumballs");}public void dispense() {System.out.println("No gumball dispensed");}public String toString() {return "sold out";}
}
  • 售卖(出)状态
public class SoldState implements State {GumballMachine gumballMachine;public SoldState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}public void insertQuarter() {System.out.println("Please wait, we're already giving you a gumball");}public void ejectQuarter() {System.out.println("Sorry, you already turned the crank");}public void turnCrank() {System.out.println("Turning twice doesn't get you another gumball!");}public void dispense() {gumballMachine.releaseBall();if (gumballMachine.getCount() > 0) {gumballMachine.setState(gumballMachine.getNoQuarterState());} else {System.out.println("Oops, out of gumballs!");gumballMachine.setState(gumballMachine.getSoldOutState());}}public String toString() {return "dispensing a gumball";}
}
  • Winner 状态:出两糖状态
public class WinnerState implements State {GumballMachine gumballMachine;public WinnerState(GumballMachine gumballMachine) {this.gumballMachine = gumballMachine;}public void insertQuarter() {System.out.println("Please wait, we're already giving you a Gumball");}public void ejectQuarter() {System.out.println("Please wait, we're already giving you a Gumball");}public void turnCrank() {System.out.println("Turning again doesn't get you another gumball!");}public void dispense() {System.out.println("YOU'RE A WINNER! You get two gumballs for your quarter");gumballMachine.releaseBall();if (gumballMachine.getCount() == 0) {gumballMachine.setState(gumballMachine.getSoldOutState());} else {gumballMachine.releaseBall();if (gumballMachine.getCount() > 0) {gumballMachine.setState(gumballMachine.getNoQuarterState());} else {System.out.println("Oops, out of gumballs!");gumballMachine.setState(gumballMachine.getSoldOutState());}}}public String toString() {return "despensing two gumballs for your quarter, because YOU'RE A WINNER!";}
}

2.6 状态模式实例:自行车升降档

可以将自身作为参数传递给处理该请求的状态对象,以允许状态对象在必要时访问上下文
状态转换交给 State

  • 自行车:即 Context
public class Bike {private GearState gearState;public Bike(GearState gearState) {this.gearState = gearState;}public GearState getGearState() {return gearState;}public void setGearState(GearState gearState) {this.gearState = gearState;}public void gearUp() {gearState.gearUp(this);}public void gearDown() {gearState.gearDown(this);}
}
  • 档数状态:抽象状态
/*** 档数状态*/
public abstract class GearState {public GearState() {}// 升档public abstract void gearUp(Bike bike);// 降档public abstract void gearDown(Bike bike);
}
  • 档数状态:实现类
public class FirstGearState extends GearState {@Overridepublic void gearUp(Bike bike) {System.out.print("Moving Up from FirstGear to SecondGear!\t");bike.setGearState(new SecondGearState());System.out.println("Current GearState: " + bike.getGearState().toString());}@Overridepublic void gearDown(Bike bike) {System.out.print("Already in the FirstGear - cannot go lower!\t");System.out.println("Current GearState: " + bike.getGearState().toString());}@Overridepublic String toString() {return "First Gear";}
}
public class SecondGearState extends GearState {@Overridepublic void gearUp(Bike bike) {System.out.print("Moving Up  from SecondGear to ThirdGear!\t");bike.setGearState(new ThirdGearState());System.out.println("Current GearState: " + bike.getGearState().toString());}@Overridepublic void gearDown(Bike bike) {System.out.print("Moving Down from SecondGear to FirstGear!\t");bike.setGearState(new FirstGearState());System.out.println("Current GearState: " + bike.getGearState().toString());}@Overridepublic String toString() {return "Second Gear";}
}
public class ThirdGearState extends GearState {@Overridepublic void gearUp(Bike bike) {System.out.print("Already in the ThirdGear - cannot go higher!\t");System.out.println("Current GearState: " + bike.getGearState().toString());}@Overridepublic void gearDown(Bike bike) {System.out.println("Moving Down from ThirdGear to SecondGear!\t");bike.setGearState(new SecondGearState());System.out.println("Current GearState: " + bike.getGearState().toString());}@Overridepublic String toString() {return "Third Gear";}
}
  • Client 测试
public class StateClientDemo {public static void main(String[] args) {Bike bike = new Bike(new SecondGearState());bike.gearDown();bike.gearDown();bike.gearDown();bike.gearUp();bike.gearUp();bike.gearUp();bike.gearUp();}
}

在这里插入图片描述

相关文章:

面向对象设计模式:行为型模式之状态模式

文章目录一、引入二、状态模式2.1 Intent 意图2.2 Applicability 适用性2.3 类图2.4 Collaborations 合作2.5 Implementation 实现2.5 状态模式与策略模式的对比2.5 状态模式实例:糖果机2.6 状态模式实例:自行车升降档一、引入 State Diagram 状态图&am…...

【Python入门第二十五天】Python 作用域

变量仅在创建区域内可用。这称为作用域。 局部作用域 在函数内部创建的变量属于该函数的局部作用域,并且只能在该函数内部使用。 实例 在函数内部创建的变量在该函数内部可用: def myfunc():x 100print(x)myfunc()运行实例 100函数内部的函数 如…...

运行时数据区及程序计数器

运行时数据区 概述 运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时…...

手写操作系统+文件系统开源啦

哈喽,我是子牙,一个很卷的硬核男人。喜欢研究底层,聚焦做那些大家想学没地方学的课程:手写操作系统、手写虚拟机、手写模拟器、手写编程语言… 今年是我创业的第二年,已经做了两个课程:手写JVM、手写操作系…...

小众但意外觉得蛮好用的剪辑软件!纯良心分享

爱剪辑 有开屏广告,一共3个界面:首页、剪同款、我的。 剪辑、配乐、字幕、滤镜、加速、贴纸、配音等主流功能都有。 特色功能有剪裁视频、倒放视频、视频旋转、视频转换GIF、转场、提取音频、画中画等。 还可以拼接视频,不过不支持FLV等小众文…...

一文带你入门angular(下)

一、angular get数据请求 angular5.x之后get,post和服务器交互使用的是HttpClientModule模块。 1.首先要在app.module.ts中引入HttpClientModule并注入 import {HttpClientModule} from "angular/common/http" 注入: import:[ …...

2023-3-6刷题情况

分巧克力 题目描述 儿童节那天有 KKK 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 NNN 块巧克力,其中第 iii 块是 HiWiH_i \times W_iHi​Wi​ 的方格组成的长方形。 为了公平起见,小明需要从这 NNN 块巧克力中切出 KKK…...

一篇教你解决如何在不加锁的情况下解决多线程问题!

怎样在不加锁的情况下解决线程安全问题,你需要了解lock free和wait free这两个概念,在此之前我们先从最简单的有锁编程开始。 我们知道,多线程同时修改共享变量时会出现数据不一致的问题,比如多个线程同时对一个变量加1&#xff…...

OPT(奥普特)一键测量传感器SmartFlash高精度的四重保证

OPT(奥普特)一键测量传感器SmartFlash集成了机器视觉的边缘提取、自动匹配、自动对焦、自动学习及图像合成等人工智能技术,采用双远心光路及多角度照明系统设计,搭载高精度运动平台,并通过亚像素边缘提取算法处理图像&…...

网络协议丨从物理层到MAC层

我们都知道TCP/IP协议其中一层,就是物理层。物理层其实很好理解,就是物理攻击的物理。我们使用电脑上网时的端口、网线这些都属于物理层,没有端口没有路由你没有办法上网。网线的头我们叫水晶头,也是物理层的一份子。如果你的面前…...

【Maven】(五)Maven模块的继承与聚合 多模块项目组织构建

文章目录1.前言2.模块的继承2.1.可继承的标签2.2.超级POM2.3.手动引入自定义父POM3.模块的聚合3.1.聚合的注意事项3.2.反应堆(reactor)4.依赖管理及属性配置4.1.依赖管理4.2.属性配置5.总结1.前言 本系列文章记录了 Maven 从0开始到实战的过程,Maven 系列历史文章清…...

Linux 常用软件安装(jdk,redis,mysql,minio,kkFileView)

1.jdk安装 查询所有跟Java相关的安装的rpm包 rpm -qa | grep java卸载所有跟openjdk相关的包: 执行命令。删除以上除了noarch 结尾的所有文件 rpm -e --nodeps java-1.8.0-openjdk-1.8.0.252.b09-2.el8_1.x86_64 rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0…...

单链表及其相关函数

实现功能BuySListNode ————————————申请一个新节点并赋值SListLength —————————————计算链表的长度SListPushBack————————————尾插SListPushFront————————————头插SListPopBack—————————————尾删SListPopFront—…...

Linux段错误调试

1、设置ulimit ulimit -a 查看 ulimit -c 2048 设置core大小 2、设置core文件信息 下面两个设置需要在root下设置,否则权限不通过 echo 1>/proc/sys/kernel/core_uses_pid echo "/tmp/corefile-%e-%p-%t" >/proc/sys/kernel/core_pattern 3、编译…...

Gopro卡无法打开视频恢复方法

下边来看一个文件系统严重受损的Gopro恢复案例故障存储: 120G SD卡故障现象:客户正常使用,备份数据时发现卡无法打开,多次插拔后故障依旧。故障分析:Winhex查看发现0号分区表扇区正常,这应该是一个exfat格式的文件系统,但是逻辑盘…...

vmware虚拟机与树莓派4B安装ubuntu1804 + ros遇到的问题

如题所示,本人在虚拟机上安装ubuntu1804,可以很容易安装,并且更换系统apt源和ros源,然后安装ros,非常顺利,但是在树莓派4B上安装raspiberry系统就遇到了好多问题。 树莓派我烧录的是这个镜像:ub…...

JS逆向hook通用脚本合集

1. cookie 通用hook Cookie Hook 用于定位 Cookie 中关键参数生成位置,以下代码演示了当 Cookie 中匹配到了 v 关键字, 则插入断点 (function () {var cookieTemp ;Object.defineproperty(document, cookie, {set: function (val) {if (val.indexOf(v…...

nacos的介绍和下载安装(详细)

目录 一、介绍 1.什么是nacos(含有官方文档)? 2.nacos的作用是什么? 3.什么是nacos注册中心? 4.核心功能 二、下载安装 一、介绍 1.什么是nacos(含有官方文档)? 一个更易于…...

【算法经典题集】前缀和与数学(持续更新~~~)

😽PREFACE🎁欢迎各位→点赞👍 收藏⭐ 评论📝📢系列专栏:算法经典题集🔊本专栏涉及到的知识点或者题目是算法专栏的补充与应用💪种一棵树最好是十年前其次是现在前缀和一维前缀和k倍…...

寻找时空中的引力波:科学家控制量子运动至量子基态

据英国每日邮报报道,时空织布里的涟漪或可以揭示宇宙在140亿年前是如何产生的,然而寻找这些名为“引力波”的涟漪却一直难以捉摸。现在美国科学家们声称他们发现了改善用于检测宇宙大爆炸的引力波的探测器的方法。 ​宇宙大爆炸残留的引力波 美国加州理…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...