`

head first 设计模式之状态模式之总结

阅读更多

 

状态模式要点:

      1.状态模式允许一个对象基于内容状态而拥有不同的行为

    2.和程序状态机不同,状态模型用类代表状态

    3.Context会将行为委托给当前状态对象

    4.通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了

    5.状态模式和策略模式有相同的类图,但是它们的意图不同

    6.策略模式通常会用行为或算法来配置Context类

    7.状态模式允许Context随着状态的变化而改变行为

    8.状态转换可以有State类或Context类控制

    9.使用状态模式通常会导致设计中类的数量大量增加

    10.状态类可以被多个Context实例共享

 

状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改它的类。

 

何时用:
     State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.

 

     不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊性质的记录,这种属性的改变(切换)又是随时可能发生的,就有可能要使用State.

 

状态模式优点:
(1) 封装转换过程,也就是转换规则
(2) 枚举可能的状态,因此,需要事先确定状态种类。

 

 

状态模式实质:
使用状态模式前,客户端外界需要介入改变状态,而状态改变的实现是琐碎或复杂的。

使用状态模式后,客户端外界可以直接使用事件Event实现,根本不必关心该事件导致如何状态变化,这些是由状态机等内部实现。

 

 

状态模式的设计步骤:

      1.首先,定义一个State接口。在这个接口内,每个动作都有一个对应的方法

      2.然后为机器中的每个状态实现状态类。这些状态类将负责在对应的状态下进行机器的行为

      3.最后,要摆脱旧的条件代码,取而代之的方式是,将动作委托到状态类

 

这里要阐述的是"开关切换状态" 和" 一般的状态判断"是有一些区别的, " 一般的状态判断"也是有 if..else if结构,例如:

    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模式,这会增加子类的数目,简单的变复杂.

 

利用状态模式将上述代码修改:

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(); 

  }

}



  


  
分享到:
评论

相关推荐

    Head First 设计模式 +Java设计模式(第2版)

    《Head First 设计模式》与《Java设计模式(第2版)》是两本非常重要的IT书籍,专注于软件开发中的设计模式。设计模式是解决软件设计中常见问题的经验总结,它们提供了一种标准的方法来处理特定场景下的问题,使得代码...

    笔记_HeadFirst设计模式.pdf

    笔记_HeadFirst设计模式

    Head First设计模式(完整高清版).pdf

    《Head First设计模式》是一本深受开发者喜爱的经典书籍,它以独特且易于理解的方式介绍了设计模式这一复杂的概念。设计模式是软件开发中的经验总结,是解决常见问题的有效模板,可以帮助我们编写更灵活、可维护和可...

    Headfirst设计模式中文高清PDF+附书源码

    《Headfirst设计模式》是一本深受开发者欢迎的设计模式学习书籍,尤其对于初学者而言,其独特的教学方式使得复杂的概念变得易于理解。这本书以其高清的中文版PDF格式提供,结合书中源码,为读者提供了深入实践的可能...

    head first 设计模式 高清中文版 pdf 第二部分

    head first 设计模式 高清中文版 pdf

    Head First设计模式(带目录).PDF

    Head First设计模式, 带目录

    Head First 设计模式 中文完整版+附书源码

    Head First 设计模式(中文完整版+附书源码 c# java Head First 设计模式(中文版) pdf 《Head First 设计模式》附书源码 《Head First 设计模式》附书源码(C#版) zip 《Head First 设计模式》附书源码(Java版)...

    Head First设计模式.pdf

    全书用两章篇幅对设计模式和GRASP作了基本介绍,3种设计模式的讲解:对于每一种模式,先给出定义,接着通过类比方式用一个现实世界中的例子说明模式的应用,然后分别以C#和Java代码例述模式的架构实现。最后一章给出...

    Head First设计模式

    Head First设计模式 Head First设计模式 Head First设计模式

    [中文]Head-First设计模式.pdf

    《Head-First设计模式》是一本面向初学者的优秀设计模式教程,主要针对Java编程语言。这本书通过易于理解的方式介绍了23种经典的GoF设计模式,帮助开发者提升代码的可复用性和可维护性。设计模式是软件工程中的重要...

    head first设计模式 下载地址

    head first设计模式 下载地址 head first设计模式 下载地址 head first设计模式 下载地址 head first设计模式 下载地址 head first设计模式 下载地址

    HeadFirst设计模式(中文版)高清版 第二部分

    HeadFirst设计模式(中文版)高清版 第二部分

    Head First设计模式彩印高清

    Head First设计模式, 中国电力出版社出版,英文书名:Head First Design Patterns。作者:弗里曼。《Head First设计模式》荣获2005年第十五届Jolt通用类图书震撼大奖。英文影印版被《程序员》等机构评选为2006年受...

    HeadFirst设计模式PPT

    《HeadFirst设计模式》是一本深受开发者欢迎的书籍,它以独特、易理解的方式介绍了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...

    Head First设计模式中文版PDF完整版.rar

    重视大脑的学习指南Head First设计模式,学习为何朋友们对工厂模式的认知可能有错,把事关紧要的模式直接装入脑海里,发掘模式大师的秘密,避免一些尴尬的错误,探究星巴兹咖啡如何以装饰者模式让自己的股价翻倍。

    HeadFirst设计模式高清非扫描中文版.zip.002

    Head First设计模式高清非扫描中文版.zip.002。一共三个压缩包,都上传了

    Head First设计模式和HeadFirst in java 源码以及23种设计模式关系图

    总的来说,这个压缩包包含的资源可以帮助你深入理解设计模式,通过《HeadFirst设计模式》和《HeadFirst in Java》的源码,你可以学习到如何在实际项目中应用这些模式。而UML类图则提供了直观的视角,便于你把握设计...

    Head First 设计模式-高清.pdf

    注:在第六章 命令模式(包括)之后一部分为影印版PDF,电脑上是不影响阅读的,手机上应该也没多大问题,介意的慎下

    headfirst设计模式

    《Head First设计模式》是一本深受开发者欢迎的设计模式教程,以其独特的视觉呈现方式和易于理解的语言,让初学者也能快速掌握设计模式的核心概念。这本书深入浅出地介绍了23种GOF(GoF,Gamma、Erich、Johnson、...

    HeadFirst设计模式英文版

    《Head First 设计模式》的英文版是一本面向初学者的设计模式入门书籍,它以幽默风趣的文风,深入浅出地介绍了软件设计中经常使用的设计模式。设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的...

Global site tag (gtag.js) - Google Analytics