状态模式,是指当实体会根据实体本身不同状态而呈现不同的行为特征时。当实体行为特征不会扩展,而状态有可能扩展的时候。可以将状态对象单独抽象出来
/**
* 状态枚举
* */
public enum State {
HAPPY,
SAD;
}
public class Person {
//状态
State state;
public void setState(State state){
this.state = state;
}
//根据不同的状态判断如何吃
public void eat(){
if(state == State.HAPPY){
System.out.println("开心的吃");
}else if(state == State.SAD){
System.out.println("悲伤的吃");
}
}
}
可以看到,目前的情况下状态一旦扩展那么将要改动eat的代码。状态模式就是将状态抽离出来
/**
* 人的状态
* */
public interface PersonState {
//人的具体方法
public void eat();
}
/**
* 开心
* */
public class HappyState implements PersonState{
//开心的吃
@Override
public void eat() {
System.out.println("开心的吃");
}
}
/**
* 难过
* */
public class SadState implements PersonState{
//难过的吃
@Override
public void eat() {
System.out.println("难过的吃");
}
}
public class Person {
//状态
PersonState state;
public void setState(PersonState state){
this.state = state;
}
public void eat(){
state.eat();
}
}
此时状态扩展只需要实现PersonState接口即可,但如果Person频繁变换,就不适合状态设计模式了