設計模式之State

設計模式之State

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的處理是複雜的

SAP HANA 的一个王炸技能,Smart Data Access SAP HANA Cloud近期推出Knowledge Graph Engine(KGE),支持RDF三元组存储和SPARQL查询,与向量引擎等组件协同实现混合检索。同时文章介绍了HANA的Smart Data Access(SDA)功能,它通过虚拟表技术实现跨系统联邦查询,支持30+种数据源(不包括PostgreSQL),适用于混合云场景。SDA通过谓词下推优化性能,典型应用包括冷热数据分层和跨系统报表分析。对于PostgreSQL连接需求,建议使用HANA的Smart Data Integration方 阅读详情

相关推荐

【python快速编程入门(第二版)黑马程序员课后编程题】

python快速编程入门(第二版)黑马程序员课后编程题

weixin_46167259的博客 1万+

Flink的State浅尝辄止

State的描述

zhua13的博客 181

MATLAB实战:手把手教你用三频四步相移法搞定结构光三维重建(附完整代码)

本文详细介绍了如何使用MATLAB实现三频四步相移法进行高精度结构光三维重建。通过光栅图像预处理、相位计算、多频外差与相位解包裹等步骤,结合完整代码示例,帮助读者掌握从二维图像到三维点云的关键技术。该方法在工业检测和逆向工程中具有抗干扰能力强、高分辨率和鲁棒性等优势。

weixin_29201933的博客 338

flink--state状态管理

前提: 1 flink state分为三种,1)operator state是跟算子关联的 2)keyed state是跟key stream关联的 3)broadcast state, 分为批Set的广播状态和流stream的流合并,一个广播流,一个事实流。 当Flink左右从checkpoint恢复,或者从savepoint中重启的时候,就回涉及到状态的重新分配,尤其是当并行度发生改变的时...

longlovefilm的博客 1493

系统安装(kuntaiR522 kvm安装)

鲲泰R522服务器kvm安装rocky

weixin_46396917的博客 1819

【C++】【STL算法】数据窄化及代码安全性

本文系统探讨了C++工程中数据窄化(narrowing conversion)的隐患与解决方案。数据窄化指将高精度/大范围类型转换为低精度/小范围类型,虽语法合法但会导致静默精度损失。其危险性体现在:错误隐蔽、STL会放大问题、数值错误具有传播性。现代C++要求窄化必须显式声明,文中提出四种工程解决方案:显式转换、边界统一转换、范围检查转换和使用GSL工具。建议在系统边界集中处理窄化,保持计算链路类型一致性,并通过分层策略(建模用double,控制用float)确保数值稳定性。核心思想是让窄化成为清晰可控的

Double Galaxy 79

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

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

Tony Chen的专栏 1829

Xilinx差分原语-IBUFGDS与OBUFGDS FPGA

它将差分信号转换为单端信号,并将其输入到FPGA的逻辑片上。它将单端信号转换为差分信号,并将其输出到FPGA的引脚。在FPGA设计中,差分信号是一种常见的信号传输方式,用于提高抗噪性和抑制共模噪声。Xilinx是一家知名的FPGA供应商,提供了许多差分原语,其中包括IBUFGDS和OBUFGDS。通过使用Xilinx的差分原语,如IBUFGDS和OBUFGDS,可以实现差分信号的输入和输出。这些差分原语提供了方便且可靠的接口,使得在FPGA设计中处理差分信号变得更加简单和高效。是差分输入信号的端口,

git_database727的博客 2095

设计模式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

rk3568 rk628桥片hdmi转lvds

RK628 是瑞芯微全新推出的视频桥接芯片,支持丰富的显示接口,支持高分辨率大屏产品转换需求。基于DRM、FB的显示框架易于使用。 输入信号支持:HDMI、RGB、BT.1120,输出信号支持 HDMI、GVI、Dual LVDS、Dual MIPI、MIPI-CSI、RGB、BT.1120,最高支持4K 60fps 输入/输出转换,并且支持输入到输出 1/4~4倍的缩放。

weixin_35723192的博客 1130

uniapp:使用uni.request请求报错errMsg“:“request:fail abort statusCode:-1(uniApp使用uni.request向服务端接口发起请求失败报错)

解决request请求报错request:fail abort statusCode:-1,Uniapp打包到app后报错request:fail abort statusCode:-1,uniapp使用uni.request请求报错{“errMsg“:“request:fail abort statusCode:-1“}的解决办法,不是SSL证书问题,跳过ssl验证,解决https问题,Uniapp报错,小程序报错(含https解决方案)(真机预览问题)uni-app打包后不发请求的原因,uni-app真

✅ 精选推荐文章 3580

State设计模式详解

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

阿木专栏 705

innovus:streamOut gds中pg text带有冒号(:)解决办法

streamOut后查看layout,发现部分PG text后面加了冒号,比如VDD: / VSS:。当然,这个问题还有另一种解决办法,就是通过脚本给terminal打text再streamOut。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1190

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

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

weixin_29290379的博客 274

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

C++ State 设计模式

C++ State 设计模式

Legend(谭海燕)的专栏 5119

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

关于Strategy和State设计模式

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

weixin_30432179的博客 119

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

su9257的博客 142

State设计模式

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

wangty0150598的博客 255

设计模式之State

设计模式之State State 的定义: 不同的状态,不同的行为;或者说,每个状态有着相应的行为. 何时使用? State 模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取 State 模式了. 不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在...

软软的沙窝!小憩的场所! 179

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

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

weixin_35566895的博客 3253

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

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

lxgljj的专栏 4482

设计模式之state模式

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

王小跑的博客 399

DesignPattern - State

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

weixin_30360497的博客 79
上一篇: 設計模式之Mediator(仲介者)
下一篇: 設計模式之Command
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值