七、状态模式
1 状态模式应用?
一个对象存在多种状态的转化,适合用状态模式,把状态转换的复杂逻辑变换转换到具体类中,一个状态对应着一个具体类。
2 状态模式的优缺点?
优点:把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的逻辑判断简化。
状态之间实现解耦,方便扩展更多的状态。
缺点:每增加一个状态,就要增加一个具体状态类。导致较多的ConcreteState子类
当状态改变不规律时候,改动大。(比如原来的状态是A--B--C--D),需要一个新状态,并且状态切换为A--E--C--B--D,修改较多。
每次在具体类中实现状态切换的时候,都要new 一个新的状态。
3 demo(以一个灯的开关状态切换为例,参考:http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html)
package com.biao.state.againchange.again; public class Demo { public static void main(String[] args) { Light light = new Light(new OffState()); light.changeState(); light.changeState(); light.changeState(); light.changeState(); } } /*具体类,灯泡,灯泡要注入状态*/ class Light{ private State state; public State getState() { return state; } public void setState(State state) { this.state = state; } public Light(State state) { this.state = state; } public void changeState(){ if(state != null){ state.changeState(this); } } } /*抽象出一个状态类*/ abstract class State{//修改灯的状态,所以要通过参数注入一个灯的引用 abstract void changeState(Light light); } /*具体的状态类,该类中要实现灯状态的切换*/ class OnState extends State{ @Override void changeState(Light light) { // TODO Auto-generated method stub System.out.println("灯关闭了"); light.setState(new OffState()); } } /*具体的状态类,该类中要实现灯状态的切换*/ class OffState extends State{ @Override void changeState(Light light) { // TODO Auto-generated method stub System.out.println("灯打开了"); light.setState(new OnState()); } }