博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
state状态设计模式
阅读量:7017 次
发布时间:2019-06-28

本文共 3341 字,大约阅读时间需要 11 分钟。

hot3.png

state定义     不同的状态,不同的行为;或者说,每个状态有着相应的行为.         就像电风扇的开关,一档的上一个是关闭,关闭的上一个是五档,五档的上一个是四档,以此类推,而且五档的下一个是关闭,关闭的下一个是一档。那么在实际应用中,我们可能会这样做:      在上一档的方法中: Java代码  收藏代码if(level == 5){      level = 4;  do something();  }else if(level == 4){      level = 3;  do something();    } else if (level == 3){      level == 2;  do something();    }      在下一档的方法中: Java代码  收藏代码if(level == 1){      level = 2;  do something();    }else if(level == 2){      level = 3;  do something();    } else if (level == 3){      level == 4;  do something();    }      单一方向的切换还好点,双方向的切换就可以考虑使用state模式了      假设现在有一个开关,控制三种颜色的切换,blue,green,red,蓝色下一个绿色,绿色下一个红色,红色下一个是蓝色,也可以倒过来 代码如下: Java代码  收藏代码package state;    /*  * 状态操作接口,执行上一个下一个的操作,还可以获得当前的状态  * 当然在这可以既执行别的操作,比如开关拨到某个颜色的时候,颜色对应的灯亮  */    public interface State {        public  void last(Context c);        public  void next(Context c);            public  String getState();      }  Java代码  收藏代码package state;    /*  * 蓝色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中  * 设置改变后的状态  */  public class BlueState implements State {        public String getState() {          // TODO Auto-generated method stub          return "blue";      }        public void last(Context c) {          c.setState(new GreenState());        }        public void next(Context c) {          c.setState(new RedState());        }    }  Java代码  收藏代码package state;    /*  * 绿色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中  * 设置改变后的状态  */  public class GreenState implements State {        public String getState() {                    return "green";      }        public void last(Context c) {          c.setState(new RedState());        }        public void next(Context c) {      c.setState(new BlueState());        }    }  Java代码  收藏代码 package state;  /*  * 红色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中  * 设置改变后的状态  */   public class RedState implements State {    public String getState() {      return "red";  }    public void last(Context c) {  c.setState(new BlueState());    }    public void next(Context c) {      c.setState(new GreenState());    }  Java代码  收藏代码package state;    /*  * 状态管理器,设置初始状态,得到当前状态,  * 提供了两个操作,上一个的操作方法中,调用了当前状态的last方法,将状态管理器的状态更新  *                下一个的操作方法中,调用了当前状态的next方法,将状态管理器的状态更新  */  public class Context {            private State state = null;        public State getState() {          return state;      }        public void setState(State state) {          this.state = state;      }            public void push(){                    state.last(this);          System.out.println(state.getState());      }            public void pull(){                    state.next(this);          System.out.println(state.getState());      }          }  Java代码  收藏代码package state;  /*  * 测试类  */  public class Test {        public static void main(String[] args) throws InterruptedException {          /*          * 创建一个状态管理器,设置初始状态为红色,          * 然后就可以执行状态管理器的last或者next方法          */          Context c = new Context();          State redsState = new RedState();                 c.setState(redsState);              while (true){                  System.out.println("当前状态:"+c.getState().getState());                  System.out.print("上一个状态: ");                   c.push();                   Thread.currentThread().sleep(2000);              }              }        }       缺点也显而易见了,如果状态太多了,对应的状态类也会比较多的。。

转载于:https://my.oschina.net/u/936286/blog/160070

你可能感兴趣的文章
jQuery|隐藏和显示
查看>>
VMware驱动程序"vmci.sys"的版本不正确 怎么解决
查看>>
除了默认的docker0网桥,启动Docker服务怎么指定使用的网桥
查看>>
Maven Tips
查看>>
win7下匿名ftp的搭建
查看>>
嵌入式开发 NVIDIA官方资源汇总
查看>>
Saltstack配置管理-业务引用haproxy
查看>>
jQuery|event的属性和方法
查看>>
linux 下将tomcat注册成服务并开机启动
查看>>
织梦 dedecms 文章内容 body 内部超链接替换为空
查看>>
js格式化日期
查看>>
详解BSCI实验五、配置PIM auto-rp
查看>>
SO_DONTROUTE和SO_BINDTODEVICE的深层次分析
查看>>
WINserver路由服务之多网段管控
查看>>
网络基础CCNP|SDN与日志
查看>>
Python3.X Socket 一个编码与解码的坑
查看>>
vs2015未能正确加载“ProviderPackage”包。
查看>>
PHP带头大哥讲解几种综合PHP网络服务器系统的选择!
查看>>
MySQL数据表所有操作命令
查看>>
使用SQLRootKit网页数据库后门控制案例
查看>>