一. 定义:
java
状态模式:当一个对象内在状态改变时,容许其改变行为,这个对象看起来像改变了其类ide
抽象状态角色(State):接口或抽象类,负责对象状态定义,并封装环境角色以实现状态切换this
环境角色(Context):定义客户端须要的接口,并负责具体状态的切换spa
具体状态角色(ConcreteState):每个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,即本状态下要作的事情,以及本状态如何过渡到其余状态对象
//抽象状态角色:接口或抽象类,负责对象状态定义,并封装环境角色以实现状态切换 public abstract class State { /** * 定义一个环境角色,就是封装状态的变化引发的功能变化,提供子类访问 */ protected Context context; public void setContext(Context context) { this.context = context; } //行为1 public abstract void handle1(); //行为2 public abstract void handle2(); }
//具体状态角色1 public class ConcreteState1 extends State{ @Override public void handle1() { //本状态下必须处理的逻辑 } @Override public void handle2() { //设置当前状态为state2 super.context.setCurrentState(Context.STATE2); //过渡到state2状态,由Context实现 super.context.handle2(); } }
//具体状态角色2 public class ConcreteState2 extends State{ @Override public void handle1() { //设置当前状态为state1 super.context.setCurrentState(Context.STATE1); //过渡到state1状态,由Context实现 super.context.handle1(); } @Override public void handle2() { //本状态下必须处理的逻辑 }
////环境角色 public class Context { //定义状态 public final static State STATE1 = new ConcreteState1(); public final static State STATE2 = new ConcreteState2(); //当前状态 private State currentState; //得到当前状态 public State getCurrentState() { return currentState; } //设置当前状态 public void setCurrentState(State currentState) { this.currentState = currentState; //切换状态 this.currentState.setContext(this); } //行为委托 public void handle1() { this.currentState.handle1(); } public void handle2() { this.currentState.handle2(); } }
public class Client { /** * 状态模式:当一个对象内在状态改变时,容许其改变行为,这个对象看起来像改变了其类 * @param args */ public static void main(String[] args) { //定义环境角色 Context context = new Context(); //初始化状态 context.setCurrentState(new ConcreteState1()); //行为执行 context.handle1(); context.handle2(); } }
环境角色约束:接口
(1)把状态对象声明为静态常量,有几个状态对象就声明几个静态常量。get
(2)环境角色具备状态抽象角色定义的全部行为,具体执行使用委托方式。it
二. 状态模式优缺点:class
状态模式优势:im
-- 结构清晰,避免过多的if-else;
-- 遵循开闭原则和单一原则;
-- 封装性好。
状态模式缺点:类膨胀。
三. 状态模式的使用场景及注意事项
1.使用场景:
行为随状态改变而改变的场景
条件、分支判断语句的替代者
2.注意事项:
行为受状态约束的状况下能够使用状态模式,并且使用时对象的状态最好不要超过5个。