状态模式
目的
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它所属的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。
类图
角色
- Context: 环境类
- State: 抽象状态类
- ConcreteState: 具体状态类
实现
抽象状态类
public interface State {
public void doAction(Context context);
}
抽象状态类
public class StartState implements State {
@Override
public void doAction(Context context) {
context.setState(this);
}
}
public class StopState implements State {
@Override
public void doAction(Context context) {
context.setState(this);
}
}
环境类
public class Context {
private State state;
public Context(){
state = null;
}
public void setState(State state){
this.state = state;
}
public State getState(){
return state;
}
}
调用类
public class Client {
public static void main(String[] args) {
Context context = new Context();
StartState startState = new StartState();
startState.doAction(context);
StopState stopState = new StopState();
stopState.doAction(context);
}
}
优缺点
优点
- 封装了转换规则。
- 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
缺点
- 状态模式的使用必然会增加系统类和对象的个数。
- 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
- 违背“开闭原则”,增加新状态类需要修改那些负责状态转换的代码,否则无法切换到新增状态;而修改某个状态类的行为也需修改对应类的代码。
使用场景
- 行为随状态改变而改变的场景。
- 条件、分支语句的代替者。