类的行为是基于它的状态改变的
意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类
菜鸟案例:
我们将创建一个 State 接口和实现了 State 接口的实体状态类。Context 是一个带有某个状态的类。
StatePatternDemo,我们的演示类使用 Context 和状态对象来演示 Context 在状态改变时的行为变化。
把图拆开
一个状态接口,和俩个它的实现类,根据题意,它的状态的改变应该就是它两个实现类的转换,
看着应该就是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