设计模式之State

坏坏彼此

坏坏彼此

2016-02-19 14:36

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

    State的定义: 不同的状态,不同的行为;或者说,每个状态有着相应的行为。

!-- frame contents -- !-- /frame contents --

    何时使用
  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";
  

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  这是一个 " 一般的状态判定",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();
  }

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  }

  在上例中,我们有两个动作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中有对状态的切换动作。
  

展开更多 50%)
分享

猜你喜欢

设计模式之State

编程语言 网络编程
设计模式之State

STATE OF THE OBVIOUS设计欣赏

美术设计
STATE OF THE OBVIOUS设计欣赏

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

设计模式之singleton

编程语言 网络编程
设计模式之singleton

Ajax设计模式之Lightbox

Web开发
Ajax设计模式之Lightbox

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Java模式设计之数据访问对象模式

编程语言 网络编程
Java模式设计之数据访问对象模式

C++设计模式之Singleton

编程语言 网络编程
C++设计模式之Singleton

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Win7磁盘碎片整理功能在哪

Win7磁盘碎片整理功能在哪

Java编程图像处理技巧

Java编程图像处理技巧
下拉加载更多内容 ↓