状态模式,从名字就能看出来是对状态的一些封装操作。
状态模式三个要素是:
- 环境角色: 上下文(context),提供容器环境,持有抽象状态的接口引用,进而根据条件控制状态的变化。
- 抽象状态角色: 定义接口以及行为。
- 具体状态角色: 每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。
对开发中经常需要来判断状态的业务逻辑,我们应该把其封装成状态的类,看看一个例子你就明白了,看状态模式是如何来实现“从开发渣渣到大神的过程的”(学习次数越多,实力越牛逼)。
首先开发人员的成长状态接口
public interface GrowState {
//学习使我们进步
public void study(String user, String record, StudyManager studyManager);
}
各种状态的实例类:
//渣渣类
public class zhazha implements GrowState {
@Override
public void study(String user, String record, StudyManager studyManager) {
System.out.println("诶我天,你这个渣渣!");
}
}
//入门类
public class accidence implements GrowState {
@Override
public void study(String user, String record, StudyManager studyManager) {
System.out.println("还不错,你已经是入门级别的了!");
}
}
//大师类
public class master implements GrowState {
@Override
public void study(String user, String record, StudyManager studyManager) {
System.out.println("恭喜啊,你已经是大师级别的了!");
}
}
学习控制类(容器类,相当于环境context类)
public class StudyManager {
//状态对象
private GrowState state;
//记录user的成长记录
private Map<String, String> studyRecord = new HashMap<>();
//记录user的学习次数
private Map<String, Integer> studyRecordCount = new HashMap<>();
public Map<String, String> getStudyRecord() {
return studyRecord;
}
public void study(String user, String studyRecord) {
Integer oldValue = studyRecordCount.get(user);
if(oldValue == null) {
oldValue = 0;
}
oldValue += 1;
studyRecordCount.put(user, oldValue);
if(oldValue == 1) {
//渣渣级别
state = new zhazha();
}
else if (oldValue > 1 && oldValue < 5){
//入门级别
state = new accidence();
}
else if (oldValue > 5){
state = new master();
}
//执行学习,面向接口的方式
state.study(user, studyRecord, this);
}
}
客户端执行测试类:
public class Client {
public static void main(String[] args) {
StudyManager studyManager = new StudyManager();
for(int i=0; i<9; i++) {
studyManager.study("me", "record");
}
}
}
执行结果:
参考于:《JAVA与模式》之状态模式