状态模式

说明

状态模式(State Pattern)属于行为型模式,也称为状态机模式(State Machine Pattern),是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
在软件开发中,经常需要根据对象的不同状态进行不同的逻辑处理,通常情况下我们会使用if-else/switch-case进行判断处理,但是大量的逻辑判断语句会使程序臃肿,不利用程序的扩展与维护。这时可以将不同状态下的逻辑处理抽象分离出来,使程序更加健壮。

结构

状态模式主要角色如下:
抽象状态角色(State):定义状态处理的统一接口;
具体状态角色(ConcreteState):根据业务需求实现具体状态的业务逻辑,并且可以根据情况调用Context角色进行状态的切换;
上下文角色(Context):维护了一个状态的引用,执行状态对应的行为,并且实现了状态的切换。

代码案例

抽象状态角色(State)

/** * @program: state * @description: 人物状态接口 *抽象状态角色(State) * @author: wxw * @create: 2024-03-11 21:51 **/public interface ICharacterState {// 释放技能方法void releaseSkills(Context context);}

具体状态角色(ConcreteState)

/** * @program: state * @description: 沉默状态 *具体状态角色(ConcreteState) * @author: wxw * @create: 2024-03-11 21:53 **/public class SilentState implements ICharacterState {@Overridepublic void releaseSkills(Context context) {System.out.println("当前人物处于沉默状态,无法释放技能!!!");}}/** * @program: state * @description: 魔法值缺少状态 * 具体状态角色(ConcreteState) * @author: wxw * @create: 2024-03-11 21:57 **/public class MPDeficiencyState implements ICharacterState {@Overridepublic void releaseSkills(Context context) {System.out.println("当前人物魔法值不足,不能释放技能!!!");}}/** * @program: state * @description: 魔法值充足状态 * @author: wxw * @create: 2024-03-11 21:59 **/public class MPPlentyState implements ICharacterState {@Overridepublic void releaseSkills(Context context) {System.out.println("当前人物魔法值充足,释放技能!!!");// 释放技能后设置为魔法值不足状态context.setState(new MPDeficiencyState());}}

上下文角色(Context)

/** * @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);}}

客户端

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();}}

输出结果

当前人物魔法值充足,释放技能!!!当前人物魔法值不足,不能释放技能!!!当前人物处于沉默状态,无法释放技能!!!当前人物魔法值充足,释放技能!!!