状态模式
说明
状态模式(State Pattern)属于行为型模式,也称为状态机模式(State Machine Pattern),是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
在软件开发中,经常需要根据对象的不同状态进行不同的逻辑处理,通常情况下我们会使用if-else/switch-case进行判断处理,但是大量的逻辑判断语句会使程序臃肿,不利用程序的扩展与维护。这时可以将不同状态下的逻辑处理抽象分离出来,使程序更加健壮。
结构
状态模式主要角色如下:
抽象状态角色(State):定义状态处理的统一接口;
具体状态角色(ConcreteState):根据业务需求实现具体状态的业务逻辑,并且可以根据情况调用Context角色进行状态的切换;
上下文角色(Context):维护了一个状态的引用,执行状态对应的行为,并且实现了状态的切换。
代码案例
抽象状态角色(State)
java
/**
* @program: state
* @description: 人物状态接口
* 抽象状态角色(State)
* @author: wxw
* @create: 2024-03-11 21:51
**/
public interface ICharacterState {
// 释放技能方法
void releaseSkills(Context context);
}
具体状态角色(ConcreteState)
java
/**
* @program: state
* @description: 沉默状态
* 具体状态角色(ConcreteState)
* @author: wxw
* @create: 2024-03-11 21:53
**/
public class SilentState implements ICharacterState {
@Override
public void releaseSkills(Context context) {
System.out.println("当前人物处于沉默状态,无法释放技能!!!");
}
}
/**
* @program: state
* @description: 魔法值缺少状态
* 具体状态角色(ConcreteState)
* @author: wxw
* @create: 2024-03-11 21:57
**/
public class MPDeficiencyState implements ICharacterState {
@Override
public void releaseSkills(Context context) {
System.out.println("当前人物魔法值不足,不能释放技能!!!");
}
}
/**
* @program: state
* @description: 魔法值充足状态
* @author: wxw
* @create: 2024-03-11 21:59
**/
public class MPPlentyState implements ICharacterState {
@Override
public void releaseSkills(Context context) {
System.out.println("当前人物魔法值充足,释放技能!!!");
// 释放技能后设置为魔法值不足状态
context.setState(new MPDeficiencyState());
}
}
上下文角色(Context)
java
/**
* @program: state
* @description: 上下文角色
* @author: wxw
* @create: 2024-03-11 22:00
**/
public class Context {
private ICharacterState state;
public Context() {
// 默认设置为魔法值充足状态
this.state = new MPPlentyState();
}
public void setState(ICharacterState state){
this.state = state;
}
public void request(){
this.state.releaseSkills(this);
}
}
客户端
java
public class Test {
public static void main(String[] args) {
Context context = new Context();
// 第一次请求正常释放技能
context.request();
// 第二次魔法值不足
context.request();
// 设置为沉默状态
context.setState(new SilentState());
context.request();
// 再次设置为魔法值充足状态
context.setState(new MPPlentyState());
context.request();
}
}
输出结果
bash
当前人物魔法值充足,释放技能!!!
当前人物魔法值不足,不能释放技能!!!
当前人物处于沉默状态,无法释放技能!!!
当前人物魔法值充足,释放技能!!!