状态模式(二十五)

Andy 2023年06月09日 728次浏览

类的行为是基于它的状态改变的
意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类

菜鸟案例:

我们将创建一个 State 接口和实现了 State 接口的实体状态类。Context 是一个带有某个状态的类。
StatePatternDemo,我们的演示类使用 Context 和状态对象来演示 Context 在状态改变时的行为变化。
image.png

把图拆开
image.png
一个状态接口,和俩个它的实现类,根据题意,它的状态的改变应该就是它两个实现类的转换,
image.png
看着应该就是Context的setState 就是进行状态的切换了,而Context 里有State的接口的属性,又是老套路,而且看了下面的代码你会感觉有观察者模式的一些特点,而Context的说明状态什么的都是调用的State的子类的toString

代码
(1)创建一个接口。
State.java

public interface State {
   public void doAction(Context context);
}

(2)创建实现接口的实体类。
StartState.java

public class StartState implements State {
 //和观察者模式一样,不从外面把StartState 添加进Context,而是从StartState的内部
   public void doAction(Context context) {
      System.out.println("Player is in start state");
      context.setState(this); 
   }
 
   public String toString(){
      return "Start State";
   }
}

StopState.java

public class StopState implements State {
 
   public void doAction(Context context) {
      System.out.println("Player is in stop state");
      context.setState(this); 
   }
 
   public String toString(){
      return "Stop State";
   }
}

(3)创建 Context 类。
Context.java

public class Context {
   private State state;
 
   public Context(){
      state = null;
   }
 
   public void setState(State state){
      this.state = state;     
   }
 
   public State getState(){
      return state;
   }
}

(4)使用 Context 来查看当状态 State 改变时的行为变化。
StatePatternDemo.java

public class StatePatternDemo {
   public static void main(String[] args) {
      Context context = new Context();
 	//创建一个开始的状态
      StartState startState = new StartState();
      //这个和观察者模式一个套路,把Context 作为参数传进去,再把此对象(this)在内部添加进Context的State
      startState.doAction(context);
 	//输出状态
      System.out.println(context.getState().toString());
 	//创建一个结束的状态
      StopState stopState = new StopState();
      stopState.doAction(context);
 
      System.out.println(context.getState().toString());
   }
}

执行程序,输出结果:

Player is in start state
Start State
Player is in stop state
Stop State
————————————————
版权声明:本文为CSDN博主「胖墩的IT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43113679/article/details/99573681