一、状态模式
1、定义
状态模式(State Pattern)又称作状态机模式(State Machine Pattern)
,允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。属于行为型设计模式。
状态模式的核心是状态与行为绑定,不同的状态对应不同的行为。
状态模式主要解决的就是控制一个对象状态的条件表达式过于复杂时的情况。通过把状态的判断逻辑转移到表示不同状态的一系列类中,可以吧复杂的判断逻辑简化。
2、结构
(1)模式的结构
主要角色如下:
- 环境类角色(Context):定义客户端需要的接口,内部维护一个当前状态实例,并负责具体状态的切换。
- 抽象状态角色(IState):定义该状态下的行为,可以有一个或多个行为。
- 具体状态角色(ConcreteState):具体实现该状态对应的行为,并且在需要的情况下进行状态切换。
3、优缺点
优点:
- 结构清晰:将状态定义成类,消除了复杂条件表达式逻辑,使代码更加简洁,提高了系统的可维护性。
- 状态类职责明确且具备扩展性。
缺点:
- 类膨胀:如果一个事务具备很多状态,则会造成状态类太多。
- 状态模式对开闭原则的支持并不太好。
4、使用场景
- 行为随状态而改变的场景。
- 一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。
二、模式的通用实现
代码如下:
public class StatePattern {
public static void main(String[] args) {
Context context = new Context();
context.setState(new ConcreteStateA());
context.handle();
System.out.println("-------------------");
context.setState(new ConcreteStateB());
context.handle();
}
}
// 环境类角色
class Context{
public static final State STATE_A = new ConcreteStateA();
public static final State STATE_B = new ConcreteStateB();
// 默认 STATE_A
private State currentState = STATE_A;
{
STATE_A.setContext(this);
STATE_B.setContext(this);
}
public void setState(State state) {
this.currentState = state;
this.currentState.setContext(this);
}
public State getState() {
return currentState;
}
public void handle(){
this.currentState.handle();
}
}
// 抽象状态角色
abstract class State{
protected Context context;
public void setContext(Context context) {
this.context = context;
}
public abstract void handle();
}
// 具体状态角色
class ConcreteStateA extends State{
@Override
public void handle() {
System.out.println("ConcreteStateA do something");
// ConcreteStateA执行完之后自动切换到 ConcreteStateB
this.context.setState(Context.STATE_B);
this.context.getState().handle();
}
}
class ConcreteStateB extends State{
@Override
public void handle() {
System.out.println("ConcreteStateB do something");
}
}
– 求知若饥,虚心若愚。