状态模式
1.定义
状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为
2.实现
状态模式
- 抽象状态(State)角色
- 具体状态(Concrete State)角色
- 环境(Context)角色
抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为
/**
* 抽象状态(State)角色
*/
public abstract class State {
//声明抽象业务方法,不同的具体状态类可以不同的实现
public abstract void handle();
}
具体状态(Concrete State)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为
/**
* 具体状态(Concrete State)角色
*/
public class ConcreteStateA extends State {
public void handle() {
System.out.println("状态A: 处理偶数");
}
}
/**
* 具体状态(Concrete State)角色
*/
public class ConcreteStateB extends State {
public void handle() {
System.out.println("状态B: 处理基数");
}
}
环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例
import java.util.Random;
/**
* 环境(Context)角色
*/
public class Context {
private State state; //维持一个对抽象状态对象的引用
private int value; //其他属性值,该属性值的变化可能会导致对象状态发生变化
private ConcreteStateA stateA;
private ConcreteStateB stateB;
public Context(){
stateA = new ConcreteStateA();
stateB = new ConcreteStateB();
}
//设置状态对象
public void setState(State state) {
this.state = state;
}
public void request() {
// 模拟条件处理
int random = new Random().nextInt(10);
if(random % 2 == 0){
setState(stateA);
}else {
setState(stateB);
}
state.handle(); //调用状态对象的业务方法
}
}
测试客户端
/**
* 测试客户端
*/
public class StateClient {
public static void main(String[] args) {
Context context = new Context();
context.request();
context.request();
// stdout
// 状态B: 处理基数
// 状态A: 处理偶数
}
}