【设计模式与体系结构】行为型模式-状态模式
简介
状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为。
状态模式的角色
环境(Context)类:定义用户所处的环境,并且维护一个状态对象,表示当前所处环境的状态
抽象状态(State)类:定义一个接口,封装与环境相关的一个特定状态的行为
具体状态(Concrete State)类:实现抽象状态接口,每个具体状态类都实现了环境的一个特定状态相关的行为
状态模式的优点
- 将行为与状态解耦:将行为和状态封装到不同的类中,耦合性低,代码结构清晰,易于维护与扩展
- 符合开闭原则:当需要新增新的状态类和行为时,只需要创建新的具体状态类,而不需要修改环境类已有的代码
状态模式的缺点
- 增加系统复杂性:每增加一个具体状态,都需要增加一个具体状态类
- 状态转换逻辑复杂:如果状态之间的转换比较复杂,则会使得系统管理难度较大
状态模式的使用场景
- 对象的行为依赖于它的状态:例如游戏中的角色处于受伤、正常或死亡等状态下,行为有所不同
- 状态转换频繁:当对象的状态经常发生变化,且状态转换的逻辑较为复杂时,使用状态模式可以简化代码的管理
正文
定义一个抽象状态接口 State.java
public interface State {
void handle();//状态对应的行为
}
定义正常状态类 NormalState.java
public class NormalState implements State {
@Override
public void handle() {
System.out.println("状态正常,无事发生");
}
}
定义受伤状态类 PainState.java
public class PainState implements State {
@Override
public void handle() {
System.out.println("受伤状态,持续扣血");
}
}
定义死亡状态类 DeadState.java
public class DeadState implements State {
@Override
public void handle() {
System.out.println("已经死亡,血条已光");
}
}
定义一个环境类 Context.java
public class Context {
private State state;
public Context() {
}
public Context(State state) {
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void request() {
state.handle();
}
}
定义一个客户端 Client.java
public class Client {
public static void main(String[] args) {
Context context = new Context(new NormalState());
context.request();
context.setState(new PainState());
context.request();
context.setState(new DeadState());
context.request();
}
}
浙公网安备 33010602011771号