状态模式(State Pattern)

状态模式

说明

状态模式(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 {

    @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)

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

输出结果

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

相关推荐

  1. ·状态模式

    2024-03-12 06:24:01       62 阅读
  2. 【设计模式状态模式

    2024-03-12 06:24:01       58 阅读
  3. 设计模式——状态模式

    2024-03-12 06:24:01       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-12 06:24:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-12 06:24:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-12 06:24:01       82 阅读
  4. Python语言-面向对象

    2024-03-12 06:24:01       91 阅读

热门阅读

  1. Golang-如何优雅的关闭一个Channel?

    2024-03-12 06:24:01       39 阅读
  2. Windows版Redis启用密码

    2024-03-12 06:24:01       38 阅读
  3. 正则表达式笔记+demo

    2024-03-12 06:24:01       45 阅读
  4. Leetcode 第388场周赛 问题和解法

    2024-03-12 06:24:01       45 阅读
  5. 商品上传上货搬家使用1688商品采集api接口

    2024-03-12 06:24:01       40 阅读
  6. JsonUtility和LitJson的特点与区别

    2024-03-12 06:24:01       41 阅读
  7. optee默认安全配置

    2024-03-12 06:24:01       40 阅读
  8. 【Linux上使用jeprof和jemalloc分析内存泄漏的方法】

    2024-03-12 06:24:01       45 阅读
  9. Pytorch学习 day12(模型的保存和加载)

    2024-03-12 06:24:01       41 阅读
  10. 02_Git

    02_Git

    2024-03-12 06:24:01      38 阅读
  11. ruoyi-nbcio-plus的Vue3前端一些插件使用介绍(一)

    2024-03-12 06:24:01       48 阅读
  12. 代码随想录day36:动态规划part4,背包问题

    2024-03-12 06:24:01       49 阅读
  13. 数据结构的学习

    2024-03-12 06:24:01       43 阅读