正文在下面,先打个广告:
状态模式的定义与特点
对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
模式的结构
状态模式包含以下主要角色。
- 环境(Context)角色:也称为上下文,它定义了客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。
- 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为。
- 具体状态(Concrete State)角色:实现抽象状态所对应的行为。
典型类图为:
demo
以学生成绩为例,每次考完试,都根据成绩修改状态。
0-59:low
60-79: middle
80-100: heigh
状态类:
public interface State {
void setScore(int score);
String getName();
int getScore();
}
三个状态:
public class Low implements State {
private int score;
private ScoreContext context;
public Low(int score, ScoreContext context) {
this.score = score;
this.context = context;
context.setState(this);
}
@Override
public void setScore(int score) {
StateUtil.modifyState(score, context);
System.out.println("current score:" + score + " State: " + context.getState().getName());
}
@Override
public String getName() {
return "low";
}
@Override
public int getScore() {
return score;
}
}
public class Middle implements State {
private int score;
private ScoreContext context;
public Middle(int score, ScoreContext context) {
this.score=score;
this.context = context;
context.setState(this);
}
@Override
public void setScore(int score) {
StateUtil.modifyState(score, context);
System.out.println("current score:" + score + " State: " + context.getState().getName());
}
@Override
public String getName() {
return "Middle";
}
@Override
public int getScore() {
return score;
}
}
public class High implements State {
private int score;
private ScoreContext context;
public High(int score, ScoreContext context) {
this.score=score;
this.context = context;
context.setState(this);
}
@Override
public void setScore(int score) {
StateUtil.modifyState(score, context);
System.out.println("current score:" + score + " State: " + context.getState().getName());
}
@Override
public String getName() {
return "High";
}
@Override
public int getScore() {
return score;
}
}
状态转换工具类
public class StateUtil {
public static void modifyState(int score, ScoreContext context) {
if (score >= 60 && score < 80) {
new Middle(score, context);
} else if (score >= 80) {
new High(score, context);
} else {
new Low(score, context);
}
}
}
成绩上下文类
public class ScoreContext {
private State state;
public ScoreContext() {
new Low(0, this);
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void setScore(int score) {
state.setScore(score);
}
}
测试方法:
public class Main {
public static void main(String[] args) {
ScoreContext context = new ScoreContext();
context.setScore(20);
context.setScore(70);
System.out.println("=======" + context.getState().getScore());
context.setScore(90);
context.setScore(20);
}
}
输出:
current score:20 State: low
current score:70 State: Middle
=======70
current score:90 State: High
current score:20 State: low