状态模式(别名:状态对象)
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
一 、 概述
一个对象的状态依赖于它的变量的取值情况,对象在不同的运行环境中,可能具有不同的状态。在许多情况下,对象调用方法所产生的行为效果依赖于它当时的状态。
状态模式的关键是将对象的状态封装成为独立的类,对象调用方法时,可以委托当前对象所具有的状态调用相应的方法,使得当前对象看起来好像修改了它的类。
二、状态模式的结构与使用
模式的结构中包括三种角色:
模式UML类图
1.环境(Context): 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;
}
}2.抽象状态(State): TemperatureState.java
public interface TemperatureState{
public void showTemperature();
}
3.具体状态(Concrete State)_1:LowState.java
public class LowState implements TemperatureState{
double n=0;
LowState(double n){
if(n<=0)
this.n=n;
}
public void showTemperature(){
System.out.println("现在温度是"+n+"属于低温度");
}
}3.具体状态(Concrete State)_2:MiddleState.java
public class MiddleState implements TemperatureState{
double n=15;
MiddleState(int n){
if(n>0&&n<26)
this.n=n;
}
public void showTemperature(){
System.out.println("现在温度是"+n+"属于正常温度");
}
}3.具体状态(Concrete State)_3:HeightState.java
public class HeightState implements TemperatureState{
double n=39;
HeightState(int n){
if(n>=39)
this.n=n;
}
public void showTemperature(){
System.out.println("现在温度是"+n+"属于高温度");
}
}
4.应用 Application.java
public class Application{
public static void main(String args[]) {
TemperatureState state=new LowState(-12);
Thermometer thermometer=newThermometer();
thermometer.setState(state);
thermometer.showMessage();
state=new MiddleState(20);
thermometer.setState(state);
thermometer.showMessage();
state=new HeightState(39);
thermometer.setState(state);
thermometer.showMessage();
}
}三、状态模式的优点