状态模式
模式说明
结构
代码演示
package com.yukiyama.pattern.behavior;
/**
* 状态模式
*/
public class StateDemo {
public static void main(String[] args) {
// 声明一个环境类
ScoreLevel scoreLevel = new ScoreLevel();
// 给出当前状态值
scoreLevel.setScore(50);
// 输出“该成绩等级为D。”
String level1 = scoreLevel.queryLevel();
System.out.printf("该成绩等级为%s。\n", level1);
scoreLevel.setScore(60);
String level2 = scoreLevel.queryLevel();
// 输出“该成绩等级为C。”
System.out.printf("该成绩等级为%s。\n", level2);
scoreLevel.setScore(80);
String level3 = scoreLevel.queryLevel();
// 输出“该成绩等级为B。”
System.out.printf("该成绩等级为%s。\n", level3);
scoreLevel.setScore(90);
String level4 = scoreLevel.queryLevel();
// 输出“该成绩等级为A。”
System.out.printf("该成绩等级为%s。\n", level4);
}
}
/**
* 抽象状态类
* 持有状态的一些属性,定义一个状态响应方法,参数是环境类实例。
* 本示例只有一个等级属性。
*/
abstract class ScoreState{
protected String level;
public abstract String queryLevel(ScoreLevel sl);
}
/**
* 具体状态类
* 实现抽象状态类的抽象方法。通过传入的分数评级类(环境类)获取到当前状态值
* (分数),判断是否可以响应,可以时返回响应结果,否则调用分数评级类的的
* setScoreState方法,将当前状态实例设置为C等级状态(状态转移)。
* 下例是D等级的状态类,为D对应的分数做出响应,令level属性值为D并返回。
* 判断不能响应时将状态改为C等级状态。
*/
class DScoreState extends ScoreState{
@Override
public String queryLevel(ScoreLevel sl) {
if(sl.getScore() < 60) {
level = "D";
return level;
} else {
sl.setScoreState(new CScoreState());
return sl.queryLevel();
}
}
}
/**
* 具体状态类
* 下例是C等级的状态类,为C对应的分数做出响应,令level属性值为C并返回。
* 判断不能响应时将状态改为B等级状态。
*/
class CScoreState extends ScoreState{
@Override
public String queryLevel(ScoreLevel sl) {
if(sl.getScore() >= 60 && sl.getScore() < 80) {
level = "C";
return level;
} else {
sl.setScoreState(new BScoreState());
return sl.queryLevel();
}
}
}
/**
* 具体状态类
* 下例是B等级的状态类,为B对应的分数做出响应,令level属性值为B并返回。
* 判断不能响应时将状态改为A等级状态。
*/
class BScoreState extends ScoreState{
@Override
public String queryLevel(ScoreLevel sl) {
if(sl.getScore() >= 80 && sl.getScore() < 90) {
level = "B";
return level;
} else {
sl.setScoreState(new AScoreState());
return sl.queryLevel();
}
}
}
/**
* 具体状态类
* 下例是A等级的状态类,为A对应的分数做出响应,令level属性值为A并返回。
* 最终状态,无转移。
*/
class AScoreState extends ScoreState{
@Override
public String queryLevel(ScoreLevel sl) {
level = "A";
return level;
}
}
/**
* 环境类(上下文类)
* 持有当前状态值int score和当前状态实例ScoreState state。通过无参
* 构造器初始化state为DScoreState。维护四个方法,getScore/setScore
* 方法是score的getter/setter;setScoreState用于设置当前状态实例,
* 状态转移时使用;queryLevel是状态响应方法,通过调用当前状态实例的
* queryLevel方法返回评级结果。
* 下例是一个分数评级类。
*/
class ScoreLevel{
private int score;
private ScoreState state;
// 通过构造器初始化当前状态为DScoreState
public ScoreLevel(){
state = new DScoreState();
}
public int getScore() {
return score;
}
public void setScore(int score) {
if(score >= 0 && score <= 100) {
this.score = score;
} else {
System.out.println("分数输入有误。");
}
}
public void setScoreState(ScoreState state) {
this.state = state;
}
public String queryLevel() {
return state.queryLevel(this);
}
}Last updated