设计模式之State

避坑指南:ArcGIS 做莫兰指数分析,你的‘空间关系概念化’选对了吗? 本文深入解析了ArcGIS中莫兰指数分析的关键参数——'空间关系概念化'的选择策略。通过对比反距离法、固定距离法和K最近邻法的适用场景与影响机制,帮助研究者避免常见误区,提升空间自相关分析的准确性和解释力。特别针对全域莫兰指数和局域莫兰指数的计算差异提供了实用建议。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> State的定义: 不同的状态,不同的行为;或者说,每个状态有着相应的行为。   何时使用?   State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换,如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了。   不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊性质的记录,这种属性的改变(切换)又是随时可能发生的,就有可能要使用State。   是否使用?   在实际使用,类似开关一样的状态切换是很多的,但有时并不是那么明显,取决于你的经验和对系统的理解深度。   这里要阐述的是"开关切换状态" 和" 一般的状态判断"是有一些区别的, " 一般的状态判断"也是有 if..elseif结构,例如:     if (which==1) state="hello";     else if (which==2) state="hi";     else if (which==3) state="bye";   这是一个 " 一般的状态判断",state值的不同是根据which变量来决定的,which和state没有关系.如果改成:     if (state.euqals("bye")) state="hello";     else if (state.euqals("hello")) state="hi";     else if (state.euqals("hi")) state="bye";   这就是 "开关切换状态",是将state的状态从"hello"切换到"hi",再切换到""bye";在切换到"hello",好象一个旋转开关,这种状态改变就可以使用State模式了。   如果单纯有上面一种将"hello""hi""bye""hello"这一个方向切换,也不一定需要使用State模式,因为State模式会建立很多子类,复杂化,但是如果又发生另外一个行为:将上面的切换方向反过来切换,或者需要任意切换,就需要State了。   请看下例:



public class Context{



  private Color state=null;



  public void push(){



    //如果当前red状态 就切换到blue

    if (state==Color.red) state=Color.blue;



    //如果当前blue状态 就切换到green

    else if (state==Color.blue) state=Color.green;



    //如果当前black状态 就切换到red

    else if (state==Color.black) state=Color.red;



    //如果当前green状态 就切换到black

    else if (state==Color.green) state=Color.black;

    

    Sample sample=new Sample(state);

    sample.operate();

  }



  public void pull(){



    //与push状态切换正好相反



    if (state==Color.green) state=Color.blue;

    else if (state==Color.black) state=Color.green;

    else if (state==Color.blue) state=Color.red;

    else if (state==Color.red) state=Color.black;



    Sample2 sample2=new Sample2(state);

    sample2.operate(); 

  }



}



在上例中,我们有两个动作push推和pull拉,这两个开关动作,改变了Context颜色,至此,我们就需要使用State模式优化它。   另外注意:但就上例,state的变化,只是简单的颜色赋值,这个具体行为是很简单的,State适合巨大的具体行为,因此在,就本例,实际使用中也不一定非要使用State模式,这会增加子类的数目,简单的变复杂。   例如: 银行帐户, 经常会在Open 状态和Close状态间转换。   例如: 经典的TcpConnection, Tcp的状态有创建 侦听 关闭三个,并且反复转换,其创建 侦听 关闭的具体行为不是简单一两句就能完成的,适合使用State   例如:信箱POP帐号, 会有四种状态, start HaveUsername Authorized quit,每个状态对应的行为应该是比较大的.适合使用State   例如:在工具箱挑选不同工具,可以看成在不同工具中切换,适合使用State.如 具体绘图程序,用户可以选择不同工具绘制方框 直线 曲线,这种状态切换可以使用State。   如何使用   State需要两种类型实体参与:   1.state manager 状态管理器,就是开关,如上面例子的Context实际就是一个state manager, 在state manager中有对状态的切换动作。   2.用抽象类或接口实现的父类,,不同状态就是继承这个父类的不同子类。   以上面的Context为例.我们要修改它,建立两个类型的实体。   第一步: 首先建立一个父类:



public abstract class State{



  public abstract void handlepush(Context c);

  public abstract void handlepull(Context c);

  public abstract void getcolor();



}



父类中的方法要对应state manager中的开关行为,在state manager中本例就是Context中,有两个开关动作push推和pull拉.那么在状态父类中就要有具体处理这两个动作:handlepush() handlepull(); 同时还需要一个获取push或pull结果的方法getcolor()   下面是具体子类的实现:



public class BlueState extends State{



  public void handlepush(Context c){

     //根据push方法"如果是blue状态的切换到green" ;

     c.setState(new GreenState());



  }

  public void handlepull(Context c){



     //根据pull方法"如果是blue状态的切换到red" ;

    c.setState(new RedState());



  }



  public abstract void getcolor(){ return (Color.blue)}



}



同样其他状态的子类实现如blue一样。   第二步: 要重新改写State manager 也就是本例的Context:



public class Context{



  private Sate state=null; //我们将原来的 Color state 改成了新建的State state;



  //setState是用来改变state的状态 使用setState实现状态的切换

  pulic void setState(State state){



    this.state=state;



  }



  public void push(){



    //状态的切换的细节部分,在本例中是颜色的变化,已经封装在子类的handlepush中实现,这里无需关心

    state.handlepush(this);

    

    //因为sample要使用state中的一个切换结果,使用getColor()

    Sample sample=new Sample(state.getColor());

    sample.operate(); 



  }



 



  public void pull(){



    state.handlepull(this);

    

    Sample2 sample2=new Sample2(state.getColor());

    sample2.operate(); 



  }



}



至此,我们也就实现了State的refactorying过程。   以上只是相当简单的一个实例,在实际应用中,handlepush或handelpull的处理是复杂的。
攻克+86手机号Discord验证墙:从“无效”到“成功”的实战指南 本文提供了一份针对+86手机号在Discord注册时频繁遭遇“手机号无效”问题的实战解决指南。文章系统分析了问题根源,并分步详解了从打造纯净网络环境、尝试多种手机号格式(如+86前加0),到更换iOS等客户端设备的有效方法,旨在帮助用户成功完成Discord手机号验证。 阅读详情

相关推荐

ABB机器人与西门子PLC、工业相机联合实现无序抓取的完整调试方案

将此方案导入系统后,逐步执行调试,确保各环节信号正常触发,即可实现高效无序抓取!

CHUXUEZHE8210的博客 1996

设计模式3——State设计模式

State状态设计模式类似于Switch多路分支功能的开关,State状态模式机制如下: 状态模式UML图如下: State状态设计模式用于改变对象的行为,在代理的生命周期里,随着状态变化从一个目标实现程序切换到另一个目标实现程序。 我们经常遇到如下的程序代码: public class Creature{ private Boolean isFrog = tru

Tony Chen的专栏 1829

别再乱选保护板了!手把手教你用ABLIC S-8254A为3/4串锂电池组DIY安全保护电路

本文详细介绍了如何使用ABLIC S-8254A保护集成电路为3/4串锂电池组DIY安全保护电路。从选型策略、电路搭建到功能验证,手把手教你实现可靠的充放电保护系统,适用于无人机、电动工具等场景,确保锂电池组的安全使用。

weixin_42525264的博客 190

设计模式State 的一个例子

设计模式State 的一个例子(引自http://blog.youkuaiyun.com/airhand/archive/2004/08/27/86405.aspx?中的部分章节)这个实例比较长,我简单说明一下,这是一个自动售货机的例子,客户可以投掷面值5、10、25的硬币,货物价值25。每当客户投了硬币就打印投的钱数和,如果够了25,就提示货物售出。state是个抽象类,它派生了5、10、15、20

山哥's 专栏 1650

opencode 完全指南:终端AI编程助手的安装、模型配置与实战

在AI编程助手快速迭代的当下,开发者对终端环境下的自动化编码需求愈发强烈。以自然语言驱动代码修改、命令执行与测试验证,已成为提升工程效率的重要方向。这类工具普遍遵循模型无关的设计原则,通过兼容OpenAI格式的接口接入多种大模型,并借助多会话管理、Skills、Memory等机制实现可审查、可干预的闭环流程。从安装配置到日常使用,再到apihub网关与免费模型的接入,终端AI助手在代码审查、跨文件重构、浏览器自动化验证等场景中展现出独特价值。本文聚焦opencode这一开源CLI工具,详细拆解其核心定位、模

weixin_33868027的博客 419

芯片硅前验证技术与驱动工程师实战指南

硅前验证是芯片开发流程中的关键环节,通过pre-silicon simulation等技术手段在流片前验证设计正确性。其核心技术包括软件仿真、FPGA原型验证和硬件仿真器解决方案,涉及Linux驱动开发、芯片架构理解和波形分析等核心技能。作为连接芯片设计与系统集成的桥梁,硅前验证能早期发现设计缺陷,节省数百万美元流片成本。以Cadence Palladium为代表的硬件仿真器,通过专用服务器系统实现比纯软件方案快100-1000倍的仿真速度,为驱动工程师提供完整的外设模型验证环境。掌握硅前验证技术可显著提升

weixin_42522857的博客 329

State设计模式详解

1.State模式适用场景 State模式在实际使用中比较多的适合状态的切换,因为我们经常会用到if...else if ...else...,进行状态切换,如果这种判断反复出现,则就可以考虑使用State设计模式来代替了。 2.State和Command两种设计模式的区别 State设计模式从调用者和被调用者出发,目的是封装调用者的行为,让调用者和统一的顶层接口交互;Command模式则从

阿木专栏 705

DC-DC电源PCB布局实战:从EMI优化到热管理

本文深入探讨了DC-DC电源PCB布局的核心实战技巧。文章从分析电流环路入手,强调通过优化“黄金三角”布局以最小化环路面积,从而有效抑制EMI并提升效率。详细阐述了功率器件摆放、地线分割、敏感信号布线、电感下方铺铜策略以及热管理设计等关键步骤,为工程师提供了一套从理论到实践的完整布局指南。

z5a6b的博客 722

java state_在Java中应用State设计模式

在Java中应用State设计模式作者:未知文章来源:www.jspcn.net发布日期:2005年01月19日在Java中应用State设计模式作者:俞良松 本文选自:开放系统世界??赛迪网 2002年11月19日对象的状态由各个属性的当前值构成。当我们调用某个对象的setXXX()方法时,通常表示修改它的XXX属性。另外,对象在执行方法时,也可能修改自己的状态。在某些情形下,例如建立事...

weixin_29290379的博客 275

0x12B 蓝屏怎么查:内存单比特翻转与硬件排查记录

Windows 蓝屏停止代码是内核检测到不可继续运行的异常时触发的保护机制,0x12B(FAULTY_HARDWARE_CORRUPTED_PAGE)更指向内存页校验失败与单比特翻转。其原理是内存管理子系统发现页面内容与校验值不一致后,为避免坏数据扩散而停机。通过 WinDbg 分析 dump、事件日志对齐时间戳,再结合 MemTest86、TestMem5、逐条单插与关闭 XMP 做交叉验证,可把内存、显存、存储链路和第三方内核模块依次排除。对编译、游戏、Hyper-V 虚拟化等高负载场景,这套记录与验证

weixin_30899023的博客 344

【Qt】Qt5.15在线安装避坑指南:从代理配置到组件选择的完整实践

本文详细介绍了Qt5.15在线安装的全流程避坑指南,包括代理配置、组件选择和常见问题解决方案。通过使用Fiddler工具和国内镜像源,可显著提升下载速度。文章还提供了组件选择的黄金法则和安装后的验证步骤,帮助开发者高效完成Qt5.15的安装与配置。

weixin_42550052的博客 271

C++ State 设计模式

C++ State 设计模式

Legend(谭海燕)的专栏 5119

手把手教你学Simulink--巴特沃斯滤波器设计与实现仿真

巴特沃斯滤波器的设计目标是拥有尽可能平滑的通带响应,这意味着在通带内信号衰减最小且没有波动。这种类型的滤波器非常适合用于音频处理、生物医学信号处理以及其他需要高保真度的应用场景。根据应用需求的不同,可以选择低通、高通、带通或带阻滤波器。明确你的系统需求,如输入信号类型(正弦波、方波等)、滤波器类型(低通、高通、带通或带阻)、截止频率、滤波器阶数等。假设我们需要设计一个4阶低通巴特沃斯滤波器,其截止频率为1kHz,用来过滤掉高于1kHz的所有频率成分。

MHD0815的博客 451

关于Strategy和State设计模式

之前,我在描述我所采用的设计模式时,一直在Strategy和State之间犹豫,略微有些拿捏不准,说哪种设计模式好。结果到最后,会根据自己所想,觉得是State就是State,觉得Strategy就是Strategy,不过,说的时候,还是会带有些犹豫。最近看Martin Fowler的《重构,改善既有代码的设计》一书,上面说到: At this stage the choice of patte...

weixin_30432179的博客 119

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

设计模式---状态模式(DesignPattern_State)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 142

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

State设计模式

最近做实验时用到了State设计模式,虽然老师说State设计模式要到以后讲,但通过自学我已经基本明白其要点,不妨在此写一些东西。 我们知道,软件在运行过程中,会产生很多的状态,状态就是指软件所处的某一种相对稳定的形式,在这里我要解释清楚它和软件基线的区别。软件的基线是指软件本身所处的相对稳定的形式,是整体性的稳定,而状态是指软件的某一部分在运行过程中所处的相对稳定状态,是局部的稳定。之所...

wangty0150598的博客 255

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

設計模式之State

設計模式之State State的定義: 不同的狀態,不同的行爲;或者說,每個狀態有著相應的行爲。 何時使用?State模式在實際使用中比較多,適合"狀態的切換"。因爲我們經常會使用If elseif else 進行狀態切換, 如果針對狀態的這樣判斷切換反復出現,我們就要聯想到是否可以採取State模式了。 不只是根據狀態,也有根據屬性。如果某個物件的屬性不同,物件的行爲就不一樣,這點在資料庫系

Inber 1475

c语言state用法,常见设计模式的解析和实现—State模式

作用:允许一个对象在其内部状态改变时改变它的行为.解析:State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状...

weixin_35566895的博客 3253

设计模式之State——交通篇(原创)

设计模式之State——交通篇 “小朋友过马路,左右看,红灯停,绿灯行,阿姨夸我是乖宝宝。”,我给女儿念着儿歌,突然女儿问我,什么是红绿灯啊?为了给她说清楚,我特意带她看我们家附近的交通灯(NearMyFamilyTrafficLight)的运行。我们都知道,交通灯有三种状态:红灯(RedLight)、黄灯(YellowLight)和绿灯(GreenLight)。交通灯状态的改变是由控制中

lxgljj的专栏 4483

设计模式之state模式

状态模式(State pattern) 允许一个对象在其内部状态改变时改变它的行为。  适用场景:   一、一个对象的行为取决于他的状态,并且它必须在运行时根据状态改变它            的行为;   二、一个操作中含有庞大的多分支条件语句,并且这些分支依赖于该对象的            状态。 优缺点: 状态模式的主要优点在于封装了转换规则,其缺点在于

王小跑的博客 399

DesignPattern - State

using System; using System.Web; //状态模式把研究对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的子类。 //状态模式的意图是让一个对象在其内部状态发生变化的时候其行为也随之改变。 //模式涉及的角色有: //1、抽象状态:定义一个接口封装环境对象的一个特定状态所对应的行为。 //2、具体状态:每一个具体状态类都实现了环境的...

weixin_30360497的博客 79

24春 软件构造02 State设计模式

State设计模式往往会让我们想到Strategy设计模式,因为他俩名字很像...当然更主要的原因是他们都采用委派的模式,但是要注意在State设计模式的时候每个状态都知道其他状态的存在,因为State设计模式当中状态是有限的,而且需要进行转移。他们两个的类图也十分相似。那么参考下面的代码,我们可以用State的实现类来代表Paper的不同状态,并且利用IntoNext函数按逻辑进行状态的转移,当然还可以拓展更多方法,这些方法可以根据不同的状态有不同的实现,例如计算引用数,需要判断一下状态是否为已发表。

qq_43324960的博客 269

J2EE设计模式之State模式

设计模式,这个概念现在是满天飞,大家手里面估计都有,Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, in the book "Design Patterns - Element of Re-Useable Object-Oriented Software",这本书。根据其中的说法,有三种,创建型模式、结构型模式和行为型模式...

mewuhua的博客 104

State Design Pattern 状态设计模式

设置好内部状态,然后依据不同的函数作为行为模式,进行状态转换。 有点像Finite Automata算法,两者的思想是一样的。 会Finite Automata,那么这个设计模式就非常easy了。 #pragma once #include <stdlib.h> #include <math.h> #include <random> #in...

weixin_30748995的博客 93
上一篇: Sun升级Java Card 新增无线支付功能
下一篇: JBuilder 6 :Borland方式的Java集成开发环境
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值