状态模式
定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
环境 -> 抽象状态 具体状态设置环境 (你中有我,我中有你)
以学生成绩状态设计为例,不及格”“中等”和“优秀” 3 种状态,当学生的分数小于 60 分时为“不及格”状态,当分数大于等于 60 分且小于 90 分时为“中等”状态,当分数大于等于 90 分时为“优秀”状态。
代码如下:
public class StateTest {
public static void main(String[] args) {
Context context = new Context();
System.out.println("学生成绩状态测试:");
context.add(30);
context.add(40);
context.add(25);
context.add(-15);
context.add(-25);
}
}
// 环境类
class Context {
private ScoreState scoreState;
public Context() {
this.scoreState = new LowState(this);
}
public ScoreState getScoreState() {
return scoreState;
}
public void setScoreState(ScoreState scoreState) {
this.scoreState = scoreState;
}
public void add(int score) {
scoreState.addScore(score);
}
}
abstract class ScoreState {
protected Context context; //环境
protected String stateName; //状态名
protected int score; //分数
public abstract void checkState(); //检查当前状态
public void addScore(int x) {
score += x;
System.out.print("加上:" + x + "分,\t当前分数:" + score);
checkState();
System.out.println("分,\t当前状态:" + context.getScoreState().stateName);
}
}
// 不及格
class LowState extends ScoreState {
public LowState(Context context) {
this.context = context;
stateName = "不及格";
score = 0;
}
public LowState(ScoreState scoreState) {
context = scoreState.context;
stateName = "不及格";
score = scoreState.score;
}
@Override
public void checkState() {
if (score >= 90) {
context.setScoreState(new HighState(this));
} else if (score >= 60) {
context.setScoreState(new MiddleState(this));
}
}
}
//具体状态类:中等
class MiddleState extends ScoreState {
public MiddleState(ScoreState state) {
context = state.context;
stateName = "中等";
score = state.score;
}
@Override
public void checkState() {
if (score < 60) {
context.setScoreState(new LowState(this));
} else if (score >= 90) {
context.setScoreState(new HighState(this));
}
}
}
//具体状态类:优秀
class HighState extends ScoreState {
public HighState(ScoreState state) {
context = state.context;
stateName = "优秀";
score = state.score;
}
@Override
public void checkState() {
if (score < 60) {
context.setScoreState(new LowState(this));
} else if (score < 90) {
context.setScoreState(new MiddleState(this));
}
}
}
参考资料:
1.http://c.biancheng.net/view/1402.html
代码地址:https://gitee.com/zhoujie1/design-mode-and-principle.git