状态模式

来源:互联网 发布:seo数据分析 编辑:程序博客网 时间:2024/05/24 16:13

状态模式(别名:状态对象)

   允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

一 、 概述

一个对象的状态依赖于它的变量的取值情况,对象在不同的运行环境中,可能具有不同的状态。在许多情况下,对象调用方法所产生的行为效果依赖于它当时的状态。

   状态模式的关键是将对象的状态封装成为独立的类,对象调用方法时,可以委托当前对象所具有的状态调用相应的方法,使得当前对象看起来好像修改了它的类。

二、状态模式的结构与使用

模式的结构中包括三种角色:

环境(Context
抽象状态(State
具体状态(Concrete State

模式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_1LowState.java

public class LowState implementsTemperatureState{

       double n=0;

       LowState(double n){

            if(n<=0)

              this.n=n;

       }

       public void showTemperature(){

              System.out.println("现在温度是"+n+"属于低温度");

       }

}

3.具体状态(Concrete State_2MiddleState.java

public class MiddleState implementsTemperatureState{

       double n=15;

       MiddleState(int n){

            if(n>0&&n<26)

               this.n=n;

       }

       public void showTemperature(){

              System.out.println("现在温度是"+n+"属于正常温度");

       }

}

3.具体状态(Concrete State_3HeightState.java

public class HeightState implementsTemperatureState{

       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=newLowState(-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();

     }

}

三、状态模式的优点 

使用一个类封装对象的一种状态,很容易增加新的状态。
在状态模式中,环境(context)中不必出现大量的条件判断语句。环境(context)实例所呈现的状态变得更加清晰、容易理解。
使用状态模式可以让用户程序很方便的切换环境(context)实例的状态。
使用状态模式不会让环境(context)的实例中出现内部状态不一致的情况。
当状态对象没有实例变量时,环境(context)的各个实例可以共巷一个状态对象。

原创粉丝点击