状态模式:当一个对象 的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
简单点说:一个对象的功能根据它内部状态而表现出不同的行为。
举一个反例,用遥控器来举例,遥控器在电视开的情况下和电视没开的情况下,同样的按键会表现出不同的结果。
普通的编程方式:
public class TeleController { /** * 开机状态 */ public static int STATE_ON = 1; /** * 关机状态 */ public static int STATE_OFF = 2; /** * 当前状态 */ private int currentState; /** * 按电源键 */ public void powerOn(){ if(currentState == STATE_ON){ currentState = STATE_OFF; System.out.println("电视关啦.."); }else{ currentState = STATE_ON; System.out.println("电视开啦.."); } } public void powerOff(){ if(currentState == STATE_ON){ currentState = STATE_OFF; System.out.println("电视关了.."); } } /** * 下一个频道 */ public void next(){ if(currentState == STATE_ON){ System.out.println("切换到下一个频道了.."); } } /** * 上一个频道 */ public void pre(){ if(currentState == STATE_ON){ System.out.println("切换到上一个频道..."); } } /** * 调大音量 */ public void turnOn(){ if(currentState == STATE_ON){ System.out.println("调大音量..."); } } public void turnOff(){ if(currentState == STATE_ON){ System.out.println("调小音量.."); } } } 看着也不错,但是代码明显已经有重复的了,比如判断状态,有人可能会说,把判断状态提成一个方法吧,这样代码既复用,又好看,但是这不能从根本上解决问题,因为根本上还是要去做判断,而这只是两种状态,如果以后加入10种状态,10个功能方法呢????你的if,else判断怎么办?╮(╯▽╰)╭根本是判断不完的好不好。。这个时候我就需要用状态模式来解决这个问题了,因为这四个方法是根据状态的不同而表现出的不同结果,所以其实我们只需要改变状态就行,而不需要去改变这四个方法,那到底怎么做,看着。
定义顶层接口,抽象与状态相关的方法:
/** * 与状态相关的方法抽象 * @author PC * */ public interface State { /** * 下一个频道 */ public void next(); /** * 上一个频道 */ public void pre(); /** * 调大音量 */ public void turnOn(); /** * 调小音量 */ public void turnOff(); } 实现类:开机状态:
/** * 开机状态 * @author PC * */ public class PowerOnState implements State { public void next() { System.out.println("切换到下一频道.."); } public void pre() { System.out.println("切换到上一频道.."); } public void turnOn() { System.out.println("调大声音.."); } public void turnOff() { System.out.println("调小声音.."); } } 关机状态: /** * 关机状态 * @author PC * */ public class PowerOffState implements State { public void next() { } public void pre() { } public void turnOn() { } public void turnOff() { } } 遥控器类: public class TeleController { /** * 状态 */ private State state; /** * 开机状态 */ private State stateOn = new PowerOnState(); /** * 关机装填 */ private State stateOff = new PowerOffState(); public void setState(State state){ this.state = state; } /** * 按电源键 */ public void powerOn(){ setState(stateOn); System.out.println("电视开了.."); } public void powerOff(){ setState(stateOff); System.out.println("电视关了.."); } /** * 下一个频道 */ public void next(){ state.next(); } /** * 上一个频道 */ public void pre(){ state.pre(); } /** * 调大音量 */ public void turnOn(){ state.turnOn(); } /** * 调小音量 */ public void turnOff(){ state.turnOff(); } } 看到没,只关心状态的切换,具体的功能让具体的状态实现类去完成,而且切换状态也不需要判断,代码清晰,扩展或者修改几乎不影响这个功能类。在powerOn状态中四个功能都有反应,在powerOff状态中四个功能都没有反应,呵呵哈哈哈。
