类图
定义
当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类
优点
- 结构清晰
- 遵循设计原则。很好的体现了开闭原则和单一职责原则
- 封装性非常好缺点
- 子类会很多,每个状态都有一个子类
使用场景
- 行为随状态改变而改变的场景
- 条件,分支判断语句的替代者
注意事项
状态模式适用于当某个对象在它的状态发生改变时,它的行为随着发生比较大的变化,即行为受状态约束的情况下可以使用状态模式
抽象状态角色
public abstract class State {
/**
* 定义一个环境角色,提供子类访问
*/
protected Context context;
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public abstract void handle1();
public abstract void handle2();
}
具体状态角色1
public class ConcreteState1 extends State {
@Override
public void handle1() {
// 改状态下必须处理的逻辑
System.out.println("ConcreteState1->handle1()");
}
@Override
public void handle2() {
System.out.println("状态转换");
// 设置当前状态为state2
super.context.setCurrentState(Context.STATE2);
// 过渡到state2状态,由Context实现
super.context.handle2();
}
@Override
public String toString() {
return "状态1";
}
}
具体状态角色2
public class ConcreteState2 extends State {
@Override
public void handle1() {
System.out.println("状态转换");
super.context.setCurrentState(Context.STATE1);
super.context.handle1();
}
@Override
public void handle2() {
System.out.println("ConcreteState2->handle2()");
}
@Override
public String toString() {
return "状态2";
}
}
具体环境角色
public class Context {
public final static State STATE1 = new ConcreteState1();
public final static State STATE2 = new ConcreteState2();
/**
* 当前状态
*/
private State currentState;
/**
* 获取当前状态
*
* @return
*/
public State getCurrentState() {
return currentState;
}
/**
* 定义状态
*
* @param 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 {
public static void main(String[] args) {
//定义环境角色
Context context = new Context();
//初始化状态
context.setCurrentState(new ConcreteState1());
System.out.println("当前状态:"+context.getCurrentState());
//行为委托
context.handle1();
System.out.println("当前状态:"+context.getCurrentState());
context.handle2();
System.out.println("当前状态:"+context.getCurrentState());
}
}
运行结果
当前状态:状态1
ConcreteState1->handle1()
当前状态:状态1
状态转换
ConcreteState2->handle2()
当前状态:状态2