快速业务通道

设计模式之State - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
经常会在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的处理是复杂的。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号