<十二>读<<大话设计模式>>之状态模式


        对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的。状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化。在程序设计方面可能要比其它模式略微复杂点,请待我慢慢将来。

        本人喜欢用代码来形象的讲述原理,可能是由于对单纯的看些理论的书有些反感或者无趣吧。我希望以后的教育也如此,要不大家都不高考了。

。嘿嘿说多了

       状态模式:当一个对象的内在状态改变时同意改变其行为。这个对象看起来像是改变了其类。

还是代码呈现吧。概念太抽象了。

1、状态类。在该状态干什么

/**

 * @author jzhf 

 *2014-11-06

 */

public interface State {

 

    //在设定状态下做什么工作

    public void writeProgram(Work work);

}

2、工作类,记录了当前状态的时间、完毕情况、当前状态

public class Work {

 

    private int hour;//工作时间

    private boolean finished;

    private State currentState;

   

    public Work(){

       currentState = new ForenoonState();//上午九点開始上班

    }

 

    //完毕工作状态设置

    public boolean taskFinished(){

       return finished;

    }

   

    //工作内容

    public void writeProgram(){

       currentState.writeProgram(this);

    }

   

    public int getHour() {

       return hour;

    }

 

    public void setHour(int hour) {

       this.hour = hour;

    }

 

    public boolean isFinished() {

       return finished;

    }

 

    public void setFinished(boolean finished) {

       this.finished = finished;

    }

 

    public State getCurrentState() {

       return currentState;

    }

 

    public void setCurrentState(State currentState) {

       this.currentState = currentState;

    }

   

}

3、上午九点状态

public class ForenoonState implements State {

 

    /* (non-Javadoc)

     * @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)

     */

    public void writeProgram(Work work) {

       // TODO Auto-generated method stub

 

       if(work != null){

           //当在上午工作时

           if(work.getHour() < 12){

              System.out.println("当前时间:"+work.getHour()+"点  上午工作,精神百倍");

           }else{

              //否则转到下午工作状态

              work.setCurrentState(new NoonState());

              work.writeProgram();

           }

       }

    }

 

}

4、中午状态

public class NoonState implements State {

 

    /* (non-Javadoc)

     * @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)

     */

    public void writeProgram(Work work) {

       // TODO Auto-generated method stub

 

       if(work != null){

           //当在下午时

           if(work.getHour() <13){

              System.out.println("当前时间:"+work.getHour()+"点  犯困。午休");

           }else{

              //否则转到下午工作状态

              work.setCurrentState(new AfterNoonState());

              work.writeProgram();

           }

       }

    }

 

}

5、下午状态

public class AfterNoonState implements State {

 

    /* (non-Javadoc)

     * @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)

     */

    public void writeProgram(Work work) {

       // TODO Auto-generated method stub

 

       if(work != null){

           //当在下午时

           if(work.getHour() <17){

              System.out.println("当前时间:"+work.getHour()+"点  下午状态还不错。继续努力");

           }else{

              //否则转到晚上工作状态

              work.setCurrentState(new EveningState());

              work.writeProgram();

           }

       }

    }

 

}

6、晚上加班状态

public class EveningState implements State {

 

    /* (non-Javadoc)

     * @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)

     */

    public void writeProgram(Work work) {

       // TODO Auto-generated method stub

 

       if(work != null){

           //当在下午时

           if(work.taskFinished()){

              System.out.println("当前时间:"+work.getHour()+"点  下班了。。

。");

              work.setCurrentState(new SleepingState());

              work.writeProgram();

           }else if(work.getHour() <21){

                  System.out.println("当前时间:"+work.getHour()+"点  加班中。

。。");

           }

       }

    }

 

}

7、假设不加班。直接睡觉,状态结束

public class SleepingState implements State {

 

    /* (non-Javadoc)

     * @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)

     */

    public void writeProgram(Work work) {

       // TODO Auto-generated method stub

 

       System.out.println("当前时间:"+work.getHour()+"点  睡觉了。");

          

    }

 

}

8、client

public class StateClient {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       // TODO Auto-generated method stub

 

       Workwork = new Work();

       work.setHour(9);//開始上班

       work.writeProgram();//開始工作

       work.setHour(11);

       work.writeProgram();

       work.setHour(12);

       work.writeProgram();

       work.setHour(13);

       work.writeProgram();

       work.setHour(14);

       work.writeProgram();

       work.setHour(17);

      

       //假设没有工作完继续

       work.setFinished(true);

      

       work.writeProgram();

       work.setHour(21);

       work.writeProgram();

       work.setHour(22);

       work.setFinished(true);

       work.writeProgram();

    }

 

}

        通过代码讲述一个故事,对状态模式有了非常形象的诠释,我想不用解释也能理解状态模式是什么了,就是一个过程的某个点的状态,而且该状态是由顺序的。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的推断逻辑转移到表示不同状态的一系列类其中。能够把复杂的推断逻辑简化。

总结:状态模式就是将与特定状态相关的行为局部化,而且将不同状态的行为切割开来,说白了目的就是为了消除庞大的条件分支语句。

原文地址:https://www.cnblogs.com/tlnshuju/p/6940268.html