首 页文章中心下载中心动画频道客户留言泉州论坛资讯中心游戏中心繁體中文
设为首页
加入收藏
联系我们
您当前的位置:今日下载站 -> ASP/PHP/.NET/XML -> 文章内容-> 旅行中的状态(state) 退出登录 用户管理
栏目导航
· 办公自动化 · 软件工程
· Java/J2EE/JSP · VC++/C#/C
· Visual Basic · Delphi/Perl
· ASP/PHP/.NET/XML · PowerBuilder
· SQL Server/My SQL · Oracle
· Access · DB2/FOXPRO
· Windows · Linux
· Unix · CorelDRAW
· AutoCAD/Firework · Photoshop
· Dreamweaver · Flash/3DS Max
· 网页特效 · 安全防护
热门文章
相关文章
· [图文] 超炫效..
· [图文] 实用教..
· [图文] 独家视..
· [图文] 用历史..
· [图文] Photo..
· [图文] 用两个..
· [图文] photo..
· [图文] 菜鸟学..
· [图文] Photo..
· [图文] 菜鸟扣..

旅行中的状态(state)

作者:佚名  来源:本站整理  发布时间:2006-12-22 12:58:46  发布人:今日下载站

减小字体 增大字体

 

我不知道我的这个标题是否合适.反正不管了.我只是希望用轻松的写法把设计模式表示清楚.(当然也许不清楚)反正我就怎么写了.OK,现在好了.如果在旅行中一个旅者有很多种状态.这些状态会直接影响到他的行为.例如.饿了就去吃饭.渴了就要喝水.累了就要休息.正常状态就要继续旅行.并且这些状态相互切换.那么你会怎么做?如果是我.我首先会想到使用开关.那要直观简单.Ok那我们就那么做

enum myState {HUNGRY ,ADRY,TIRE,OK};
public class StateManager{

  private myState state=null;

  public void Execute(){
//执行状态
            DoThing dt=new DoThing(state);
    dt.Execute();
//切换状态
                 swich(state){
                  case  myState.HUNGRY: 
                      state=myState.ADRY;
                   case  myState.ADRY:
                     state=myState.TIRE;
                   case  myState.TIRE:
                     state.=myState.OK;
                    case  myState.OK:                      
                      state.=myState.HUNGRY;
                  }
      }
}
public class DoThing{
      private myState state=null;
      DoThing(myState svalue){
               state=svalue;
      }
     public  void  Execute(){
                swich(this.state){
                   case  myState.HUNGRY: 
                       Console.Writeline("吃饭");
                   case  myState.ADRY:
                       Console.Writeline("喝水");
                   case  myState.TIRE:
                      Console.Writeline("休息");
                    case  myState.OK:                      
                      Console.Writeline("继续旅行");
                   }
     }
}

由以上可以看出.状态的变化直接影响到了.所要发生的事情.并且状态是在不断发生变化的.如果试想一下在复杂的情况下不是简单的赋值而是要做很多复杂的工作.例如POP邮箱TcpConection这样的情况开关语句显得很繁琐.也许你会说写函数,可是那一的情况是不够通用.并且不符合面向对象原则.是的接下来我们依然要做的是把开关踢掉.因为我们有理由相信我们有更好的办法来解决问题.
由以上我们可以看出.状态由一个状态管理者和状态本身来决定其行为.因此.要考虑的是如何让管理者能管理更多的状态.也就是说状态必须被抽象出来.换句话说也就是要使用接口或抽象类来解决问题.
interface ImyState{
       void Execute(StateManager sm);
       myState  getState();
}
这就是一个抽象的状态.也就是其他具体的状态要派生至此.并且我们还必须要改写管理者对象.因为实际管理对象来完成开关所必须的指责.当然我们不用开关语句或if...else if.....而是用对象来出来具体情况.不相信就看着吧.....
public class Hungry_State : ImyState{
       void Execute(StateManager sm){
  //切换到下一个状态
          sm.setState(new ADRY_State());
          sm.Execute();
        }
       myState  getState(){
          retuen  myState.HUNGRY;
        }
}
public class ADRY_State : ImyState{
       void Execute(StateManager sm){ 
     //切换到下一个状态
          sm.setState(new ADRY_State());
          sm.Execute();
        }
      myState  getState(){
          retuen  myState.ADRY;
       }
}
public class TIRE_State : ImyState{
     void Execute(StateManager sm){
       //切换到下一个状态
          sm.setState(new ADRY_State());
          sm.Execute();
      }
       myState getState(){
          retuen  myState.TIRE;
       }
}
public class OK_State : ImyState{
       void Execute(StateManager sm){
         //切换到下一个状态
          sm.setState(new ADRY_State());
          sm.Execute();
         }
       myState getState(){
          retuen  myState.OK;
        }
}

public class StateManager{
   private  myState ms=null;
   void setState(ImyState ims){
       ms=ims;
    }
    void Execute(){
     ms.Execute(this);
     DoThing dt=new DoThing(this.ms.getState());
 dt.Execute();
   }
}

至此,管理者也重构完毕.这样我们就没有使用开关语句.而使用了更适合的面向对象原则.


本文地址:http://www.newbooks.com.cn/info/25625.html
[] [返回上一页] [打 印] [收 藏]
上一篇文章: 我的代理人(proxy)
下一篇文章: 孪生兄弟(prototype)
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 管理登录
Copyright © 2002-2006 cntoday.com.cn. All Rights Reserved .
Powered by:NewAsp SiteManageSystem Version 2.1 SP1 1030