设计模式-状态模式:让对象的行为随状态改变而清晰可控

devtools/2025/2/12 22:12:21/

🌟 引言

场景痛点:
你是否遇到过这样的代码?

java">if (state == "待支付") {// 处理待支付逻辑
} else if (state == "已支付") {// 处理已支付逻辑
} else if (...) {// 无限的条件分支...
}

条件分支爆炸导致代码臃肿、难以维护?状态模式正是解决这类问题的利器!

本文亮点:

  • 3个真实代码示例
  • 角色结构图 + 对比表格
  • JDK源码应用分析

一、状态模式是什么?

1.1 概念

状态模式(State Pattern) 是一种行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为。状态模式将对象的行为封装到不同的状态类中,使得对象在不同状态下有不同的行为表现。

简单来说,状态模式的核心思想是:将状态与行为分离,让对象的行为随着状态的改变而自动改变,而不是通过大量的条件判断来实现。

核心思想:

  • 状态与行为解耦:将每个状态的行为封装到独立类中。
  • 消除条件分支:通过多态实现状态切换,避免if-else嵌套。

1.2 举个栗子 🌰

想象一个自动售货机

  • 状态:待投币 → 已投币 → 售出 → 缺货
  • 行为:投币、退币、出货在不同状态下表现不同。
    状态模式实现,代码将清晰如丝滑!

🔧 二、状态模式原理与结构

2.1 结构图

+-------------------+        +-------------------+
|      Context      |        |       State       |
|-------------------|        |-------------------|
| - state: State    |<-------| + handle(): void  |
| + setState(State) |        +-------------------+
| + request()       |                  ^
+-------------------+                  ||+-----------------------------------+|                                   |+-------------------+             +-------------------+| ConcreteStateA    |             | ConcreteStateB    |

http://www.ppmy.cn/devtools/157773.html

相关文章

python_json转yolo文件

文章内容 将labelme的内容转换成yolo需要的txt文件 import json import os import shutil import random# Convert label to idx # with open("labels.txt", "r") as f: # classes [c.strip() for c in f.readlines()] # idx_dict {c: str(i) f…

WebRTC 客户端与ZLMediaKit通讯

1 web浏览器js方式 要使用 WebRTC 客户端与 ZLMediaKit 通讯&#xff0c;您需要设置一个 WebRTC 客户端并与 ZLMediaKit 进行连接。以下是一个基本的步骤和示例代码&#xff0c;帮助您实现这一目标。 ### 步骤 1. **安装 ZLMediaKit**&#xff1a;确保您已经在服务器上安装并…

[Linux] 关于路径

背景 在终端执行命令时&#xff0c;如何理解这件事?并且如何理解附加的一些参数? 回答 路径的概念 绝对路径与相对路径 绝对路径&#xff08;Absolute Path&#xff09;&#xff1a;以根目录 / 开始&#xff0c;完整地描述了从根目录到目标文件或目录的层次关系。例如&am…

JavaScript 基础语法:变量、数据类型、运算符、条件语句、循环

JavaScript 是一种动态类型的脚本语言&#xff0c;广泛用于前端开发。以下是 JavaScript 基础语法的核心内容&#xff0c;包括变量、数据类型、运算符、条件语句和循环。 --- ### 1. 变量 变量用于存储数据。JavaScript 中有三种声明变量的方式&#xff1a; - **var**&…

轻量级服务器http-server

安装 sudo npm install http-server -g 运行 1. 直接去到要跑起来的目录&#xff0c;在终端输入 cd xxxx文件夹http-server //只输入http-server的话&#xff0c;更新了代码后&#xff0c;页面不会同步更新http-server -c-1 //同步更新页面http-server -a 127.0.0.1 -p 808…

Vue(7)

一.Vuex &#xff08;1&#xff09;概述 1.是什么 vuex是一个vue的状态管理工具&#xff0c;状态就是数据&#xff0c;可以帮助管理vue通用的数据&#xff08;多组件共享的数据&#xff09; 2.场景 ①某个状态在很多个组件来使用&#xff08;个人信息&#xff09; ②多个组…

CSS 相关知识

1、高度已知&#xff0c;三栏布局&#xff0c;左右宽度 200&#xff0c;中间自适应&#xff0c;如何实现&#xff1f; <body><div class"box"><div class"box1">高度已知</div><div class"box2">左右宽度 200&…

Redis 事务的介绍

1. Redis 事务介绍 Redis 的事务和 MySQL 的事务概念上是类似的&#xff0c;不过也有一定区别&#xff1a; 弱化的原子性&#xff1a;Redis 没有 “回滚机制”&#xff0c;只能批量执行操作&#xff0c;但如果其中一个操作失败&#xff0c;不会恢复到初始状态。不保证一致性&a…