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



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

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

    。嘿嘿说多了

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

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

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

        }

     

    }

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

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

  • 相关阅读:
    Failed to load ApplicationContext
    多维度分析2017年最热门的编程语言
    JAVA垃圾回收机制概要
    Comparable与Comparator,java中的排序与比较
    静态代码块、非静待代码块、静态变量的执行次序
    如何看一段JAVA代码耗了多少内存
    各个JAVA场景下的内存图
    The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    <html>
    造轮子 | 怎样设计一个面向协议的 iOS 网络请求库
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6940268.html
Copyright © 2020-2023  润新知