文章目录
介绍
描述
状态模式设计模式属于行为型模式,对于控制一个对象状态转换的条件表达式过于复杂时,将其特定的状态相关的行为都放入一个对象中,通过定义新的状态类去改变当前上下文状态从而改变它的相关行为。
特点
-
优点:取代大量的if-else操作,多个环境对象共享一个状态对象,减少相互间的依赖。
-
缺点:增加系统类和对象的个数,导致系统维护难度增加。
实现原理
将同一个状态对象传入,在不同的状态中,改变实例变量的值。
Context(上下文类):在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象。
State(抽象状态类):作为接口以封装与Context类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现这些方法,从而不同状态下对象的行为也不同。
ConcreteState(具体状态类):它是抽象状态类的子类,每一个子类实现一个与Context类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。
适用
-
当一个事件或者对象有很多种状态,并且之间相互转换,对不同的状态要求不同的行为的场景。
-
条件、分支语句的代替者。
状态模式
实现
模拟游戏开始结束的不同状态切换。
第一步:创建游戏环境。
public class Context {
private State state;
public Context() {
state = null;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
第二步:创建状态接口State。
public interface State {
public void doAction(Context context);
}
第三步:实现不同状态接口StartState、EndState。
// 开始状态
public class StartState implements State{
@Override
public void doAction(Context context) {
System.out.println("游戏 开始状态 ....");
context.setState(this);
}
@Override
public String toString() {
return "State => StartState";
}
}
// 结束状态
public class EndState implements State{
@Override
public void doAction(Context context) {
System.out.println("游戏 结束状态 ....");
context.setState(this);
}
@Override
public String toString() {
return "State => EndState";
}
}
第四步:测试。
public class Test {
public static void main(String[] args) {
// 当前游戏环境创建
Context context = new Context();
StartState startState = new StartState();
// 设置
startState.doAction(context);
System.out.println(context.getState());
EndState endState= new EndState();
endState.doAction(context);
System.out.println(context.getState());
/*
游戏 开始状态 ....
State => StartState
游戏 结束状态 ....
State => EndState
*/
}
}
1216

被折叠的 条评论
为什么被折叠?



