状态模式:
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
适用场景:
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
组成:
- context类:维护一个ConcreteState子类的实例,这个实例定义当前状态。
- state接口: 定义一个接口以封装与Context的一个特定状态相关的行为。
- ConcreteStates类:每一子类实现state与Context的一个状态相关的行为。
类图:
应用例子:
比如一个简单的例子,起床了就去工作,工作完了就睡觉,睡起来了就起床,一直是个循环,动作依赖状态的三个状态的变化。
程序代码:
public class Context { private State state; public Context(State state) { this.state = state; } public void request(){ state.handle(this); } public State getState() { return state; } public void setState(State state) { this.state = state; } }
public interface State { void handle(Context context); }
public class GetUpState implements State { @Override public void handle(Context context) { System.out.println("起床了"); context.setState(new WorkState()); } }
public class SleepState implements State{ @Override public void handle(Context context) { System.out.println("睡觉"); context.setState(new GetUpState()); } }
public class WorkState implements State { @Override public void handle(Context context) { System.out.println("上班"); context.setState(new SleepState()); } }
public class Test { public static void main(String[] args) { Context context = new Context(new GetUpState()); context.request(); context.request(); context.request(); } }
效果图: