状态(state)模式:状态模式的意图是,容许一个对象在其内部状改变时改变它的行为。看起来就像是改变了它的类同样。主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的状况。把状态的判断逻辑转移到表示不一样的一系列类当中,能够把复杂的逻辑判断简单化。java
角色:设计模式
三、场景(Context)角色:定义客户端所感兴趣的接口,而且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象现有的状态。ide
总结:感受状态模式就是将原本在外部进行的状态转移,挪到了具体状态类内部进行。它经过具体状态类(Concrete State)持有场景的引用,改变场景(Context)的状态,从而不须要在外部控制状态的变化。学习
package com.perfecking.base; public class StateModeDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub LightManager lightManager = new LightManager(); lightManager.setState(new GreenLight()); lightManager.shine(); } } interface State{ public void change(LightManager light); } class LightManager{ State state = null; public void setState(State state){ this.state = state; } public void shine(){ while(true){ state.change(this); } } } class GreenLight implements State{ private static final int SLEEP_TIME = 2000; @Override public void change(LightManager light) { // TODO Auto-generated method stub System.out.println("Green Light Is Shining!请通行~~"); try { Thread.sleep(SLEEP_TIME); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } light.setState(new YellowLight()); } } class RedLight implements State{ private final static int SLEEP_TIME = 3000; @Override public void change(LightManager light) { // TODO Auto-generated method stub System.out.println("Red Light Is Shining!禁止通行~"); try { Thread.sleep(SLEEP_TIME); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } light.setState(new GreenLight()); } } class YellowLight implements State{ private final static int SLEEP_TIME = 1000; @Override public void change(LightManager light) { // TODO Auto-generated method stub System.out.println("Yellow Light Is Shining!禁止通行~"); try { Thread.sleep(SLEEP_TIME); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } light.setState(new RedLight()); } }
参考:java设计模式学习this