类图
工程目录
代码
AbstractState.java
package com.company.pattern.demo12;
/**
* 抽象状态类: 定义一个接口以封装与Context的一个特定状态相关的行为
* @author blazar
*/
public abstract class AbstractState {
/**
* 用来描述与状态相关的行为
* @param context
*/
public abstract void handle(Context context);
}
Context.java
package com.company.pattern.demo12;
/**
* 维护一个ConcreteState子类的实例
* @author blazar
*/
public class Context {
private AbstractState abstractState;
public Context(AbstractState abstractState){
this.abstractState = abstractState;
}
public AbstractState getAbstractState() {
return abstractState;
}
public void setAbstractState(AbstractState abstractState) {
this.abstractState = abstractState;
System.out.println("当前状态:"+ this.abstractState.getClass().getName());
}
public void request(){
abstractState.handle(this);
}
}
ConcreteStateA.java
package com.company.pattern.demo12;
/**
* 具体状态A
* @author blazar
*/
public class ConcreteStateA extends AbstractState{
@Override
public void handle(Context context) {
// 设置A的下一个状态是B
context.setAbstractState(new ConcreteStateB());
}
}
ConcreteStateB.java
package com.company.pattern.demo12;
/**
* 具体状态B
* @author blazar
*/
public class ConcreteStateB extends AbstractState{
@Override
public void handle(Context context) {
// 设置B的下一个状态是A
context.setAbstractState(new ConcreteStateA());
}
}
测试类 Main.java
package com.company.pattern.demo12;
/**
* 测试类
* @author blazar
*/
public class Main {
public static void main(String[] args) {
Context context = new Context(new ConcreteStateA());
context.request();
context.request();
context.request();
context.request();
}
}
使用场景
- 状态模式是为了解决if…else分支太复杂的问题,所以,如果判断逻辑太复杂,可以考虑使用状态模式;
- 使用状态模式可以让一个对象在它的内在状态变化时,改变其行为;
注意
AbstractState.java和Context.java有相互关联,相互依赖是不被允许的,但是相互关联则可以;