状态模式(State Pattern)

状态模式

说明

状态模式(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 复制代码
当前人物魔法值充足,释放技能!!!
当前人物魔法值不足,不能释放技能!!!
当前人物处于沉默状态,无法释放技能!!!
当前人物魔法值充足,释放技能!!!
相关推荐
Summer_Xu13 小时前
模拟 Koa 中间件机制与洋葱模型
前端·设计模式·node.js
云徒川15 小时前
【设计模式】原型模式
java·设计模式·原型模式
huang_xiaoen1 天前
java设计模式之桥接模式(重生之我在地府当孟婆)
设计模式·桥接模式
HappyGame021 天前
设计模式-观察者模式
观察者模式·设计模式
渊渟岳1 天前
掌握设计模式--解释器模式
设计模式
牵牛老人1 天前
C++设计模式-责任链模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·责任链模式
肥仔哥哥19301 天前
设计模式分类与定义(高软55)
设计模式·软考·高软·设计模式分类
云徒川2 天前
【设计模式】过滤器模式
windows·python·设计模式
找了一圈尾巴2 天前
设计模式(结构性)-代理模式
设计模式·代理模式
渊渟岳2 天前
掌握设计模式--模板方法模式
设计模式