当前位置: 首页 > article >正文

【设计模式-状态模式】

定义

状态模式(State Pattern)是一种行为型设计模式,允许对象在其内部状态改变时改变其行为。该模式将状态的变化封装在状态对象中,从而使得对象的行为随着状态的变化而变化。

UML图

在这里插入图片描述
角色

  • Context(上下文):持有一个当前状态的引用,并提供一个方法来改变状态。
  • State(状态接口):定义一个接口,用于在不同状态下执行的行为。
  • ConcreteState(具体状态):实现状态接口,定义在此状态下具体的行为。

代码

// 状态接口
interface State {
    void handle(Context context);
}

// 上下文类
class Context {
    private State currentState;

    public Context(State initialState) {
        currentState = initialState;
    }

    public void setState(State state) {
        currentState = state;
    }

    public void request() {
        currentState.handle(this);
    }
}

// 具体状态 A
class ConcreteStateA implements State {
    @Override
    public void handle(Context context) {
        System.out.println("Handling request in State A.");
        context.setState(new ConcreteStateB()); // 切换到状态 B
    }
}

// 具体状态 B
class ConcreteStateB implements State {
    @Override
    public void handle(Context context) {
        System.out.println("Handling request in State B.");
        context.setState(new ConcreteStateA()); // 切换到状态 A
    }
}

// 测试状态模式
public class StatePatternDemo {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStateA());

        context.request(); // 输出: Handling request in State A.
        context.request(); // 输出: Handling request in State B.
        context.request(); // 输出: Handling request in State A.
    }
}

优点

  • 简化代码:将与状态相关的行为封装在状态类中,减少了条件语句的复杂性。
  • 状态易扩展:添加新状态时,只需增加新的状态类,而不需要修改已有的代码。
  • 单一职责原则:每个状态的行为独立,符合单一职责原则。

缺点

  • 状态类数量增多:每个状态都需要一个类,可能导致类数量增加,增加管理难度。
  • 上下文与状态紧密耦合:上下文和状态之间的耦合较强,可能影响系统的灵活性。

适用场景

  • 对象行为变化:如一个订单状态(待付款、已付款、已发货、已完成)在不同状态下的行为不同。
  • 有限状态机:如游戏中的角色状态(静止、移动、攻击)。
  • 工作流管理:如审批流程中各个状态之间的转换。

http://www.kler.cn/a/320109.html

相关文章:

  • pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)
  • 从0开始学习搭网站第二天
  • 【Node.js的安装与配置】
  • React:构建用户界面的JavaScript库
  • 在Linux系统中无网络安装Nginx并配置负载均衡
  • 【9.1】Golang后端开发系列--Gin快速入门指南
  • 【React】获取DOM
  • Mac 安装一系列工具文章汇总
  • 深度学习:调整学习率
  • ubuntu24.04系统openjdk17源码编译openjdk17
  • 【GUI设计】基于图像分割和边缘算法的GUI系统(7),matlab实现
  • 进制数知识(2)—— 浮点数在内存中的存储 和 易混淆的二进制知识总结
  • 【踩坑笔记】vue3 element-plus el-input 无法输入问题
  • php在线相册
  • 计算机丢失mfc110.dll是什么原因与有哪些解决方法详解
  • 10.Lab Nine —— file system-下
  • CorePress Pro 网站加载慢 WordPress
  • 计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档
  • JavaScript window的open和close用法
  • LeetCode 面试经典150题 137.只出现一次的数字II
  • 深入探索 RUM 与全链路追踪:优化数字体验的利器
  • Python有常用库学习整理(一)
  • ThreadPoolExecutor的原理?
  • 【大数据】元数据是解锁数据价值的关键
  • JPA+Thymeleaf增删改查
  • WPF 绑定 DataGrid 里面 Button点击事件 TextBlock 双击事件