状态模式:主要用来解决对象在多种状态转换时需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换。当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像改变了其类。
举例:人的一生。小的时候(假设是0~7岁)只能当幼儿园学生;青年时(假设是7 ~ 18岁)可以当初中和高中生,相应可以做的事情也变多了;成年时,可以做大学生,硕士生等等,做的事情变得更多了。
- 状态模式的关键是将对象的状态封装称为独立的类,对象调用方法时,可以委托当前对象所具有的状态调用相应的方法,是当前对象看起来好像是修改了它的类。
角色说明:
- 环境( Context ):环境是一个类,该类含有抽象状态声明的变量,可以引用任何具体状态类的实例。用户对该环境类的实例在某种状态下的行为感兴趣。
- 抽象状态( State ):抽象状态是一个接口或抽象类。抽象状态中定义了与环境的一个特定状态相关的若干个方法。
- 具体状态( Concrete State ):具体状态是实现( 扩展 )抽象状态( 抽象类 )的类。
“普通” 状态模式案例
Thermometer.java
public class Thermometer {
// 环境
TemperatureState state;
public void showMessage() {
System.out.println("*********");
state.showTemperature();
System.out.println("*********");
}
public void setState(TemperatureState state) {
this.state = state;
}
}
TemperatureState.java
public interface TemperatureState {
// 抽象状态
public void showTemperature();
}
LowState.java
public class LowState implements TemperatureState{
// 具体状态
double n = 0;
public LowState(double n) {
if(n<=0) {
this.n=n;
}
}
@Override
public void showTemperature() {
System.out.println("现在的温度是"+n+"属于低温度");
}
}
MiddleState.java
public class MiddleState implements TemperatureState{
// 具体状态
double n = 15;
public MiddleState(double n) {
if(n>0&&n<26) {
this.n=n;
}
}
@Override
public void showTemperature() {
System.out.println("现在的温度是"+n+"属于低温度");
}
}
HeightState.java
public class HeightState implements TemperatureState{
// 具体状态
double n = 15;
public HeightState(double n) {
if(n>=39) {
this.n=n;
}
}
@Override
public void showTemperature