java设计模式-State(状态)模式
程序员文章站
2022-06-17 13:48:46
...
state定义
不同的状态,不同的行为;或者说,每个状态有着相应的行为.
就像电风扇的开关,一档的上一个是关闭,关闭的上一个是五档,五档的上一个是四档,以此类推,而且五档的下一个是关闭,关闭的下一个是一档。那么在实际应用中,我们可能会这样做:
在上一档的方法中:
在下一档的方法中:
单一方向的切换还好点,双方向的切换就可以考虑使用state模式了
假设现在有一个开关,控制三种颜色的切换,blue,green,red,蓝色下一个绿色,绿色下一个红色,红色下一个是蓝色,也可以倒过来
代码如下:
缺点也显而易见了,如果状态太多了,对应的状态类也会比较多的。。
不同的状态,不同的行为;或者说,每个状态有着相应的行为.
就像电风扇的开关,一档的上一个是关闭,关闭的上一个是五档,五档的上一个是四档,以此类推,而且五档的下一个是关闭,关闭的下一个是一档。那么在实际应用中,我们可能会这样做:
在上一档的方法中:
if(level == 5){ level = 4; do something(); }else if(level == 4){ level = 3; do something(); } else if (level == 3){ level == 2; do something(); }
在下一档的方法中:
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,蓝色下一个绿色,绿色下一个红色,红色下一个是蓝色,也可以倒过来
代码如下:
package state; /* * 状态操作接口,执行上一个下一个的操作,还可以获得当前的状态 * 当然在这可以既执行别的操作,比如开关拨到某个颜色的时候,颜色对应的灯亮 */ public interface State { public void last(Context c); public void next(Context c); public String getState(); }
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()); } }
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()); } }
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()); } }
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()); } }
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); } } }
缺点也显而易见了,如果状态太多了,对应的状态类也会比较多的。。
推荐阅读
-
JavaScript设计模式精华摘抄(持续更新...)-考拉阅读前端团队-SegmentFault思否
-
《Head First 设计模式》代码之PHP版(面向对象学习)第1/2页
-
js 设计模式——状态模式
-
Java设计中的Builder模式的介绍
-
c#设计模式之单例模式的实现方式
-
23种GoF设计模式概述
-
Java自学-类和对象 单例模式
-
React组件设计模式之组合组件应用实例分析
-
Mybaits 源码解析 (十一)----- 设计模式精妙使用:静态代理和动态代理结合使用:@MapperScan将Mapper接口生成代理注入到Spring
-
设计模式之单例模式(懒汉式单例、饿汉式单例、登记式单例)