设计模式回顾系列文章: 主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。
------------------------------------------------
状态模式:
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
主要解决:当控制一个对象状态的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
使用场景:
当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。
一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
程序实现:
抽象状态类,定义一个与Context相关的状态接口handle:
public abstract class State{
public abstract void handle(Context context);
}
具体状态类A:
public class ConcreteStateA extends State{
@Override
public void handle(Context context) {
//处理A状态相关业务
System.out.println("Now State is A ...");
//执行完A逻辑后,自动切换到B状态.
context.setState(new ConcreteStateB());
System.out.println("Change State to B ...");
}
}
具体状态类B:
public class ConcreteStateB extends State{
@Override
public void handle(Context context) {
//处理B状态相关业务
System.out.println("Now State is B ...");
//执行完B逻辑后,自动切换到A状态.
context.setState(new ConcreteStateA());
System.out.println("Change State to A ...");
}
}
Context类定义当前的状态:
public class Context{
private State currentState;//当前状态
public Context(State state){
currentState=state;
}
public void setState(State state){
this.currentState=state;
}
public State getState(){
return this.currentState;
}
/**
* 对请求做处理,并设置下一状态.
*/
public void changeState(){
currentState.handle(this);//将Context对象本身的引用传入当前状态类,用以切换状态.
}
}
程序入口:
public static void main(String[] args){
Context context = new Context(new ConcreteStateA());//初始化状态为A
context.changeState();//每次请求都切换状态
context.changeState();
context.changeState();
context.changeState();
}
举例:用于消除庞大的条件分支语句的情况,通过把各种状态转移逻辑分布到State的子类之间,减少相互间的依赖。