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

16.状态模式:思考与解读

原文地址:状态模式:思考与解读  更多内容请关注:深入思考与解读设计模式

引言

在开发软件系统时,特别是当对象的行为会随着状态的变化而变化时,系统往往会变得复杂。你是否遇到过这样的情况:一个对象的行为在不同的状态下表现不同,但你却不得不在代码中通过大量的if语句来处理状态之间的转换?这样做是否让代码变得冗长、难以维护?

如果我们能够通过一种方式,将对象的不同状态和状态下的行为封装起来,而让状态的转换变得更加自然、清晰,这样是否能使得系统更加灵活,易于扩展?

状态模式正是为了解决这一问题而设计的。它通过将每个状态封装成独立的类,使得对象在不同状态下的行为可以独立变化,从而避免了过多的条件判断。你是否理解,这样的设计能够使得系统在状态变化时更加灵活,且易于维护?

在本文中,我们将通过一系列问题,逐步引导你理解状态模式的核心思想、应用场景以及如何实现它。

什么是状态模式?

问题1:你是否遇到过一个对象的行为需要根据不同的状态来变化的情况?在这种情况下,通常如何处理?

假设你有一个对象,它的行为会随着状态的变化而变化。你是如何实现这些变化的?是通过在一个方法中增加大量的if条件判断来处理不同的状态,还是使用其他方式来管理这些状态?你是否觉得,过多的条件判断会导致代码的复杂性增加?

问题2:如果可以将每个状态的行为独立封装在不同的对象中,这样是否能让代码更加清晰,且容易扩展?

状态模式通过将不同的状态封装成独立的类,使得对象的行为随着状态的变化而变化,而不需要依赖于大量的条件判断。你是否理解,这种封装状态的方式能够将不同状态的行为解耦,从而使得状态的管理变得更加灵活?

状态模式的核心概念

问题3:状态模式通常包含哪些角色?每个角色的职责是什么?

状态模式通常包含以下几个角色:

  1. 上下文(Context):持有当前状态,并委托状态的行为。

  2. 状态(State):定义一个接口,表示在不同状态下对象的行为。

  3. 具体状态(ConcreteState):实现状态接口,封装特定的状态下的行为。

你能理解这些角色是如何协同工作的?它们如何通过状态的封装使得对象的行为在不同状态下得以改变?

问题4:为什么要将状态的行为封装成独立的类?如何避免直接在上下文类中进行大量的状态转换判断?

在传统设计中,你可能会通过if语句来判断当前状态,然后执行不同的行为。而状态模式将每个状态封装成独立的类,这样每个类只负责处理当前状态下的行为。你是否理解,这种方式如何帮助你避免在代码中堆砌大量的条件判断,从而让代码更加清晰且易于扩展?

问题5:状态模式如何让状态之间的转换变得更加自然?如果状态发生变化,是否只需要改变上下文的状态,而不需要修改行为的实现?

状态模式允许状态的切换通过上下文类来管理,而状态类本身并不关心其他状态。你是否理解,为什么这种方式让状态的转换变得更加清晰?每次状态改变时,是否只需要改变上下文的状态,而不需要改动其他地方的代码?

状态模式的实现

让我们通过一个简单的例子来说明状态模式的实现。假设我们在开发一个简单的上下文管理系统,其中一个对象(如Order)可能处于不同的状态(如NewPaidShipped)。

步骤1:定义状态接口

from abc import ABC, abstractmethodclass OrderState(ABC):@abstractmethoddef handle(self, order):pass

问题6:为什么我们需要定义一个状态接口(OrderState)?它的作用是什么?

OrderState接口定义了状态类的行为方法handle(),所有具体状态类都需要实现该方法。你能理解,通过一个统一的接口来处理状态下的行为,可以让不同状态的类实现各自独立的行为吗?

步骤2:定义具体状态类
class NewOrderState(OrderState):def handle(self, order):print("Order is new, processing the order.")order.set_state(PaidOrderState())class PaidOrderState(OrderState):def handle(self, order):print("Order is paid, preparing the shipment.")order.set_state(ShippedOrderState())class ShippedOrderState(OrderState):def handle(self, order):print("Order has been shipped, waiting for confirmation.")

问题7:NewOrderStatePaidOrderStateShippedOrderState是如何实现OrderState接口的?它们分别处理了哪些操作?

每个具体状态类(如NewOrderState)实现了handle()方法,封装了对应状态下的行为,并在行为完成后通过order.set_state()来切换到下一个状态。你是否理解,为什么将不同状态的行为封装到不同的类中,使得状态的管理更加灵活?

步骤3:定义上下文类
class Order:def __init__(self):self.state = NewOrderState()  # 初始状态为新订单def set_state(self, state: OrderState):self.state = statedef handle(self):self.state.handle(self)

问题8:Order类是如何管理状态的?为什么Order类需要一个set_state()方法来切换状态?

Order类维护当前状态,并提供set_state()方法来更改状态。通过这种方式,状态的切换和行为执行解耦。你是否理解,为什么这种设计让状态管理变得更加清晰,且易于扩展?

步骤4:客户端代码
def main():order = Order()order.handle()  # 新订单处理order.handle()  # 付款处理order.handle()  # 发货处理if __name__ == "__main__":main()

问题9:在客户端代码中,如何通过Order对象处理状态转换?为什么客户端不需要关心状态的具体实现,而是通过handle()方法来处理状态变化?

客户端通过调用order.handle()来触发状态转换。你是否理解,为什么这种方式让客户端代码不需要关心状态类的实现细节,只需通过统一的接口来处理操作?

状态模式的优缺点

问题10:状态模式的优点是什么?它如何简化状态管理,并提高系统的灵活性?

状态模式的优点在于它能够将不同状态的行为封装在独立的类中,从而避免了大量的条件判断,使得系统的扩展变得更加灵活。你是否理解,这种设计如何减少了代码的重复性,并且让每个状态类负责自己的行为?

问题11:状态模式的缺点是什么?它是否可能导致类的数量过多,增加系统的复杂性?

尽管状态模式带来了很大的灵活性,但它也可能导致类的数量急剧增加,特别是在状态很多的情况下。你是否认为,状态模式在某些简单场景下可能过于复杂?是否可能带来额外的类管理和维护成本?

适用场景

问题12:状态模式适用于哪些场景?

状态模式适用于以下场景:

  • 对象的行为会随着状态的变化而变化时。

  • 状态变化较为频繁,并且需要封装每个状态下的行为时。

  • 当你希望将状态转换和行为解耦时。

你能想到其他适用场景吗?例如,游戏角色的状态管理、网络连接的状态管理等,是否也可以使用状态模式?

问题13:状态模式是否适用于所有场景?是否有些场景不需要这么复杂的设计模式?

状态模式对于状态变化较为复杂的系统非常有效,但在一些简单的系统中,是否可以使用更简单的方式来管理状态变化?你是否认为,在某些场景下,使用状态模式可能会带来不必要的复杂性?

接下来,我们将通过具体的代码示例来加深理解状态模式。

状态模式深入解读

一、引言

状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态变化时改变其行为。对象的状态改变时,它看起来像是改变了其类。换句话说,状态模式使得对象在不同的状态下能表现出不同的行为。它通过将状态封装成不同的状态类来管理对象的状态变化,从而避免了复杂的条件语句。


二、简单理解:什么是状态模式?

1. 什么是状态模式?

状态模式的核心思想是:对象的行为会根据其内部状态的变化而变化。换句话说,状态模式让对象在不改变其类的情况下,根据状态的不同做出不同的反应。通过使用状态模式,我们能够将不同的状态封装成独立的类,从而避免了代码中繁杂的 if-else 或 switch 语句。

通俗地讲,状态模式就像是你有一个智能手机,它根据不同的状态(如锁屏、解锁、充电等),表现出不同的行为。比如,当手机处于锁屏状态时,按钮不会响应按压,而处于解锁状态时,按钮可以正常工作。你不需要通过复杂的判断语句来处理状态变化,状态模式让每个状态的行为独立处理。

2. 状态模式的组成部分

状态模式通常包含以下几个部分:

  • 上下文(Context):维护当前状态的对象,并提供改变状态的方法。

  • 状态接口(State):定义所有具体状态类必须实现的行为接口。

  • 具体状态类(ConcreteState):实现了状态接口,并定义了在该状态下的具体行为。


三、用自己的话解释:如何理解状态模式?

1. 类比实际生活中的场景

假设你有一个电梯,它根据不同的状态表现出不同的行为。电梯的状态可能包括“关闭门”、“开门”、“上升”、“下降”等。当电梯处于不同的状态时,它的行为也不同。例如,在“上升”状态下,电梯不会响应开门操作,而在“开门”状态下,电梯不会开始上升。

在编程中,状态模式将电梯的状态封装成不同的类(如 ClosedDoorStateOpenDoorStateMovingUpState),并根据电梯的状态切换行为,从而避免了复杂的判断语句。

2. 为什么要使用状态模式?

状态模式的好处是它能避免代码中大量的条件判断语句,使得对象在不同状态下的行为更加清晰且易于管理。每个状态都有独立的类来处理自己特定的行为,这样既增加了代码的可维护性,也使得状态的变换变得更加灵活。


四、深入理解:状态模式的实现

接下来,我们通过一个具体的代码示例来实现状态模式,帮助你更好地理解如何在代码中使用这个模式。

示例:电梯控制系统

假设我们需要开发一个电梯控制系统,电梯有多个状态(如“开门”、“关门”、“上升”、“下降”等),电梯的行为会根据当前状态的变化而变化。我们将使用状态模式来管理电梯的状态,并根据不同状态做出不同的行为。

1. 定义状态接口
# 状态接口:定义电梯状态的行为
class ElevatorState:def press_button(self):passdef open_door(self):passdef close_door(self):passdef move_up(self):passdef move_down(self):pass
2. 定义具体状态类:开门、关门、上升、下降
# 具体状态类:开门
class OpenDoorState(ElevatorState):def press_button(self):print("Button pressed. Closing door.")def open_door(self):print("The door is already open.")def close_door(self):print("Closing door.")def move_up(self):print("Cannot move up while the door is open.")def move_down(self):print("Cannot move down while the door is open.")# 具体状态类:关门
class ClosedDoorState(ElevatorState):def press_button(self):print("Button pressed. The elevator is moving.")def open_door(self):print("Opening door.")def close_door(self):print("The door is already closed.")def move_up(self):print("The elevator is moving up.")def move_down(self):print("The elevator is moving down.")# 具体状态类:上升
class MovingUpState(ElevatorState):def press_button(self):print("Button pressed. The elevator is already moving up.")def open_door(self):print("Cannot open door while moving up.")def close_door(self):print("Door is already closed while moving up.")def move_up(self):print("The elevator is already moving up.")def move_down(self):print("Cannot move down while moving up.")# 具体状态类:下降
class MovingDownState(ElevatorState):def press_button(self):print("Button pressed. The elevator is already moving down.")def open_door(self):print("Cannot open door while moving down.")def close_door(self):print("Door is already closed while moving down.")def move_up(self):print("Cannot move up while moving down.")def move_down(self):print("The elevator is already moving down.")
 
3. 定义上下文类:电梯
# 上下文类:电梯
class Elevator:def __init__(self):self.state = ClosedDoorState()  # 初始状态为关门def set_state(self, state: ElevatorState):self.state = statedef press_button(self):self.state.press_button()def open_door(self):self.state.open_door()def close_door(self):self.state.close_door()def move_up(self):self.state.move_up()def move_down(self):self.state.move_down()
4. 客户端代码:使用电梯
# 客户端代码:创建电梯实例并执行操作
elevator = Elevator()# 开门
elevator.open_door()# 按下按钮,电梯开始上升
elevator.press_button()
elevator.move_up()# 试图开门
elevator.open_door()# 关闭门并移动
elevator.close_door()
elevator.move_up()# 再次开门
elevator.open_door()# 电梯下降
elevator.move_down()
代码解析:
  1. ElevatorState 类:这是状态接口,定义了电梯状态的行为。所有具体的状态类都必须实现这个接口。

  2. OpenDoorStateClosedDoorStateMovingUpStateMovingDownState 类:这些是具体的状态类,表示电梯的不同状态(开门、关门、上升、下降)。每个类都实现了 ElevatorState 接口,并根据当前状态提供了不同的行为实现。

  3. Elevator 类:这是电梯的上下文类,包含一个 state 属性表示电梯的当前状态。它提供了 press_buttonopen_doorclose_doormove_up 和 move_down 方法,这些方法委托给当前状态来执行具体的操作。电梯可以通过 set_state 方法改变状态。

  4. 客户端代码:客户端通过 Elevator 类来控制电梯的状态和行为,而不需要直接操作电梯的各个状态类。通过改变电梯的状态,客户端可以实现不同的电梯行为。


五、解释给别人:如何讲解状态模式?

1. 用简单的语言解释

状态模式就像是你有一个电梯,它根据不同的状态(如“开门”、“关门”、“上升”、“下降”等)表现出不同的行为。每个状态的行为都由一个独立的类来处理,电梯的行为会随着状态的变化而变化。你不需要自己编写复杂的 if-else 或 switch 语句来处理不同的状态,而是通过状态模式将每个状态的行为封装在不同的类中,保持代码的简洁性和可维护性。

2. 为什么要使用状态模式?

使用状态模式的好处是,它避免了复杂的条件判断逻辑,让对象在不同状态下的行为更加清晰和可管理。通过将每个状态封装成独立的类,状态的变化和行为的处理变得更加灵活,同时也能让代码更加易于扩展和维护。


六、总结

状态模式通过将每个状态的行为封装成独立的类,使得对象的行为能够随着状态的变化而变化,从而减少了条件判断的复杂性,并提高了系统的灵活性。然而,状态模式也可能导致类的数量过多,从而增加系统的复杂性。

通过以上学习过程,我们可以得出以下结论:

  • 状态模式 是通过将对象的状态封装为不同的状态类,让对象在不同状态下表现出不同的行为。它通过将状态变化与行为分离,使得代码更加清晰且易于管理。

  • 状态模式适用于那些具有多个状态且每个状态下表现不同行为的对象。例如电梯、售货机等系统可以使用状态模式来管理它们的状态。

状态模式的优点:

  • 清晰性:每个状态的行为由独立的状态类处理,避免了复杂的条件判断。

  • 灵活性:可以方便地增加新的状态和状态转移,而不影响已有的代码。

  • 可维护性:通过将状态逻辑分离,代码更加简洁,易于扩展和维护。

状态模式的缺点:

  • 类的数量增多:每个状态都需要一个独立的类,这可能导致类的数量增多。

  • 管理复杂:如果状态太多,可能会导致状态类变得复杂,难以管理。

相关文章:

16.状态模式:思考与解读

原文地址:状态模式:思考与解读 更多内容请关注:深入思考与解读设计模式 引言 在开发软件系统时,特别是当对象的行为会随着状态的变化而变化时,系统往往会变得复杂。你是否遇到过这样的情况:一个对象的行为在不同的状…...

ActiveMQ 源码剖析:消息存储与通信协议实现(二)

四、KahaDB 消息存储实现细节 (一)存储原理分析 KahaDB 作为 ActiveMQ 从 5.4 版本开始的默认消息存储引擎,其基于日志文件的存储原理具有独特的设计和优势 。在 KahaDB 的存储目录(如${activemq.data}/kahadb)下&am…...

明远智睿SD2351核心板:工业AIoT时代的创新引擎

在当今工业互联网飞速发展的浪潮中,人工智能(AI)与物联网(IoT)的深度融合正以前所未有的态势重塑着传统制造业的格局。从自动化生产线的精准控制到智能仓储的高效管理,从设备运行的实时监测到产品质量的严格…...

iPhone 和 Android 在日期格式方面的区别

整篇文章由iPhone 和 Android 在日期格式方面有所不同引起,大致介绍了,两种时间标准,以及在 JavaScript 下的格式转换方法。 Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。 iPhone 和 Android 在日期格式方面有所不同。其中,iPhone(iOS)使…...

使用VSCode在Windows 11上编译运行项目

使用VSCode在Windows 11上编译运行项目 VSCode是一个功能强大的跨平台代码编辑器,可以很好地支持C/C项目开发。以下是使用VSCode在Windows 11上编译运行此项目的详细步骤。 1. 安装VSCode 访问VSCode官网下载并安装VSCode安装完成后,启动VSCode 2. 安…...

边缘计算,运维架构从传统的集中式向分布式转变

在当今数字化时代,边缘计算的崛起正在改变着运维的格局。随着物联网、5G 等技术的快速发展,越来越多的数据和应用正在向边缘设备迁移,这给运维团队带来了新的挑战和机遇。 一、边缘计算崛起带来的运维挑战 边缘计算将计算和数据存储靠近数据…...

【基础篇】prometheus热更新解读

文章目录 本篇内容讲解热更新参数源码解读本篇总结本篇内容讲解 prometheus热更新源码解读 热更新参数 –web.enable-lifecycle : 代表开启热更新配置 修改配置文件发http请求# curl -X POST -vvv localhost:9090/-/reload * About to connect() to localhost port 9090 (…...

为了结合后端而学习前端的学习日志(1)——纯CSS静态卡片案例

前端设计专栏 使用纯CSS创建简洁名片卡片的学习实践 在这篇技术博客中,我将分享我的前端学习过程,如何使用纯HTML和CSS创建一个简洁美观的名片式卡片,就像我博客首页展示的那样。这种卡片设计非常适合作为个人简介、产品展示或团队成员介绍…...

汽车服务小程序功能点开发

汽车养护服务功能 智能保养预约:根据车辆品牌、型号及行驶里程,自动推荐保养项目,支持线上预约 4S 店或合作维修厂,选择服务时间与地点。故障诊断与维修:车主上传车辆故障现象,系统智能初步诊断&#xff0…...

SENSE2020BSI sCMOS科学级相机主要参数及应用场景

SENSE2020BSI sCMOS科学级相机是一款面向宽光谱成像需求的高性能科学成像设备,结合了背照式(Back-Side Illuminated, BSI)CMOS技术与先进信号处理算法,适用于天文观测、生物医学成像、工业检测等领域。以下是其核心特点及技术细节…...

《汽车噪声控制》复习重点

题型 选择 填空 分析 计算 第一章 噪声定义 不需要的声音,妨碍正常工作、学习、生活,危害身体健康的声音,统称为噪声 噪声污染 与大气污染、水污染并称现代社会三大公害 声波基本概念 定义 媒质质点的机械振动由近及远传播&am…...

物流无人机结构与载货设计分析!

一、物流无人机的结构与载货设计模块运行方式 1.结构设计特点 垂直起降与固定翼结合:针对复杂地形(如山区、城市)需求,采用垂直起降(VTOL)与固定翼结合的复合布局,例如“天马”H型无人机&am…...

docker创建一个centOS容器安装软件(以宝塔为例)的详细步骤

备忘:后续偶尔忘记了docker虚拟机与宿主机的端口映射关系,来这里查看即可: docker run -d \ --name baota \ --privilegedtrue \ -p 8888:8888 \ -p 8880:80 \ -p 8443:443 \ -p 8820:20 \ -p 8821:21 \ -v /home/www:/www/wwwroot \ centos…...

D盘出现不知名文件

各位大佬,电脑D盘去年还干干净净的,后来突然就出现了所圈部分的几个不知名文件,请问这是什么东西?是否可以删除?...

Rust 中 Arc 的深度分析:从原理到性能优化实践

在 Rust 的并发编程中,Arc(Atomic Reference Counted) 是一个非常关键的智能指针类型,用于在多个线程之间共享数据的所有权。它通过原子操作维护引用计数,确保在多线程环境下安全地管理堆内存资源。然而,很…...

qsort函数

在本篇中&#xff0c;将深入了解qsort函数的用法。 1.qsort函数的基础知识 该函数是用来排序的&#xff0c;这是一个可以直接用来排序数据的库函数&#xff08;#include<stdlib.h>&#xff09;&#xff0c;底层使用的是快速排序的方式。 常见的排序方式有&#xff1a; …...

01 一文了解大数据存储框架:数据库、数据仓库、数据集市、数据网格、数据湖、数据湖仓

1. 大数据存储框架 1.1 定义 数据库&#xff08;Database&#xff09;&#xff1a;数据库是按照数据结构来组织、存储和管理数据的仓库&#xff0c;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据仓库&#xff08;Data Warehouse&#xff…...

QT —— QWidget(2)

QT —— QWidget&#xff08;2&#xff09; windowTitlewindowIconQt 资源系统 (qrc 机制) 详解基本概念使用方法1. 创建 .qrc 文件 设置背景windowOpacity 我们今天继续来学习QWidget&#xff0c;如果大家上一次的博客还没有看过&#xff0c;可以点击这里&#xff1a; https:/…...

微信小程序预览文件 兼容性苹果

uni.request({url: url,method: GET,header: {Authorization: token,responseType: blob,},responseType: "arraybuffer",success: (res) > {uni.hideLoading()const fs wx.getFileSystemManager(); //获取全局唯一的文件管理器let index url.lastIndexOf("…...

QT:qt5调用打开exe程序并获取调用按钮控件实例2025.5.7

为实现在 VS2015 的 Qt 开发环境下打开外部 exe&#xff0c;列出其界面按钮控件的序号与文本名&#xff0c;然后点击包含特定文本的按钮控件。以下是更新后的代码&#xff1a; #include <QCoreApplication> #include <QProcess> #include <QDebug> #include…...

Flink + Kafka 数据血缘追踪与审计机制实战

一、引言 在实时数据系统中,“我的数据从哪来?去往何处?” 是业务方最关心的问题之一。 尤其在以下场景下: 📉 金融风控:模型出现预警,需回溯数据源链路。 🧾 合规审计:监管要求提供数据全流程路径。 🛠 运维排查:Kafka Topic 数据乱序或错发后快速定位来源。 …...

【图书管理系统】详细讲解用户登录:后端代码实现及讲解、前端代码讲解

1. 约定前后端交互接口 [请求] /user/login [参数] userName&password [响应] 登录成功返回–true&#xff1b;登录失败返回–false 2. 后端代码 2.1 后端代码的逻辑 Controller层&#xff1a; &#xff08;1&#xff09;从请求和参数可以得出&#xff0c;前端通过127.0.…...

uni-app实现完成任务解锁拼图功能

界面如下 代码如下 <template><view class"puzzle-container"><view class"puzzle-title">任务进度 {{completedCount}}/{{totalPieces}}</view><view class"puzzle-grid"><viewv-for"(piece, index) in…...

鸿蒙开发——1.ArkTS声明式开发(UI范式基本语法)

鸿蒙开发——1、ArkTS声明式开发:UI范式基本语法 [TOC](鸿蒙开发——1、ArkTS声明式开发:UI范式基本语法)一、ArkTS的基本组成&#xff08;1&#xff09;核心概念&#xff08;像贴标签一样控制组件&#xff09;&#xff08;2&#xff09;基础工具包&#xff08;现成的积木块&am…...

ChatGPT-4o:临床医学科研与工作的创新引擎

技术点目录 2024大语言模型最新进展介绍ChatGPT-4o提示词使用方法与技巧ChatGPT-4o助力临床医学日常生活、学习与工作ChatGPT-4o助力临床医学课题申报、论文选题及实验方案设计ChatGPT-4o助力信息检索、总结分析、论文写作与投稿、专利idea构思与交底书的撰写ChatGPT-4o助力临床…...

Excel点击单元格内容消失

Excel点击单元格内容消失 前言一、原因说明二、解决方案1.菜单栏中找到“审阅”&#xff0c;选择“撤销工作表保护”2.输入密码3.解除成功 前言 Excel想要编辑单元格内容时&#xff0c;无论是单击还是双击单元格内容都莫名其妙的消失了 一、原因说明 单击或者双击Excel中单元…...

单片机-STM32部分:7、GPIO输入 按键

飞书文档https://x509p6c8to.feishu.cn/wiki/RtuVw6GgZiuwyBkxmdDcdsAFnKk 根据原理图&#xff0c;找到KEY1对应的PC3 找到CubeMX中的PC3&#xff0c;设置为GPIO_Input 右击&#xff0c;修改引脚名称为KEY1 或者在GPIO配置属性中修改 引脚模式&#xff1a;这里默认为输入模式&…...

从创意到变现:独立创造者的破局之路——解码《Make:独立创造者手册》

在创业浪潮奔涌的时代,独立创造者正成为商业领域中一股不可忽视的新兴力量。他们凭借对创新的执着、对问题的敏锐洞察,以及对自由创业模式的追求,试图在竞争激烈的市场中开辟属于自己的天地。《Make:独立创造者手册》如同一位经验丰富的创业导师,为独立创造者们提供了一套…...

14前端项目----登录/注册

登录/注册 assets用户注册模块登录模块tokenlogin组件业务token校验获取用户登录信息 登录成功---Header组件 assets assets文件夹:一般也是放置静态资源–>一般是多个组件共用的静态资源 webpack 会把 assests 静态资源当作是一个模块&#xff0c;打包到 js 文件里,不存在a…...

【FreeRTOS-消息队列】

参照正点原子以及以下gitee笔记整理本博客&#xff0c;并将实验结果附在文末。 https://gitee.com/xrbin/FreeRTOS_learning/tree/master 一、队列简介 1、FreeRTOS中的消息队列是什么 答&#xff1a;消息队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传…...

二叉查找树,平衡二叉树(AVL),b树,b+树,红黑树

🌲 一、二叉查找树(Binary Search Tree,简称 BST) 📌 定义 二叉查找树是一棵二叉树,它满足这样的特性: 每个节点最多有两个子节点(左、右)对于任意一个节点: 它左子树的所有节点值都比它小它右子树的所有节点值都比它大📈 举个例子 复制代码 10/ \5 20/ \ …...

可执行文件格式(ELF格式)以及进程地址空间第二讲【Linux操作系统】

文章目录 可执行文件的格式可执行文件中存储了什么可执行文件中的虚拟地址以及加载 进程地址空间第二讲CPU如何执行进程的代码再谈进程地址空间的区域划分 可执行文件的格式 源文件被编译器编译之后的可执行文件&#xff0c;并不是只有代码和数据&#xff0c;还有一定的格式&a…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】8.1 基础图表绘制(折线图/柱状图/散点图)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL数据分析实战&#xff1a;基础图表绘制&#xff08;折线图/柱状图/散点图&#xff09;8.1 基础图表绘制8.1.1 折线图&#xff1a;展现数据趋势数据准备图表绘制步…...

Yii2.0 模型规则(rules)详解

一、基本语法结构 public function rules() {return [// 规则1[[attribute1, attribute2], validator, options > value, ...],// 规则2[attribute, validator, options > value, ...],// 规则3...]; }二、规则类型分类 1、核心验证器&#xff08;内置验证器&#xff0…...

Notepad++中XML格式化插件介绍

Notepad++中XML格式化插件介绍 背景安装指南安装步骤验证安装成功安装失败可尝试使用说明XML文件格式正确时格式化错误格式检查XML Tools插件核心功能盘点常见问题格式化后没变化中文显示乱码拯救杂乱XML格式!Notepad++这个神器插件,必须接收!背景 接手别人写的XML,缩进乱成…...

在 R 中,清除包含 NA(缺失值)的数据

在 R 中&#xff0c;清除包含 NA&#xff08;缺失值&#xff09;的数据可以通过多种方式实现&#xff0c;具体取决于你希望如何处理这些缺失值。以下是几种常见的方法&#xff0c;包括删除包含 NA 的行、删除包含 NA 的列&#xff0c;或者用特定值填充 NA。 1. 删除包含 NA 的…...

Linux复习笔记(一)基础命令和操作

遇到的问题&#xff0c;都有解决方案&#xff0c;希望我的博客能为你提供一点帮助。 一、Linux中的基础命令和操作&#xff08;约30%-40%) 1.用户和组&#xff08;5%左右&#xff09; 1.1用户简介&#xff08;了解&#xff09; 要求&#xff1a;了解&#xff0c;知道有三个用户…...

多线程的出现解决了什么问题?深入解析多线程的核心价值

多线程的出现解决了什么问题?深入解析多线程的核心价值 1. 引言 在计算机科学中,多线程(Multithreading) 是一种重要的并发编程技术,它允许一个进程同时执行多个任务,从而提高程序的性能和响应能力。那么,多线程究竟是为了解决哪些问题而诞生的?它的核心价值是什么?…...

java集合菜鸟教程

1、Java集合的分类 1Java中的集合类可以分为两大类&#xff1a; &#xff08;1&#xff09;实现Collection接口&#xff0c;Collection是一个基本的集合接口&#xff0c;Collection中可以容纳一组集合元素&#xff08;Element&#xff09;&#xff0c;图1是Collection与子类的…...

体育培训的实验室管理痛点 质检LIMS如何重构体育检测价值链

在竞技体育与全民健身并行的时代背景下&#xff0c;体育培训机构正面临双重挑战&#xff1a;既要通过科学训练提升学员竞技水平&#xff0c;又需严格把控运动安全风险。作为实验室数字化管理的核心工具&#xff0c;质检LIMS系统凭借其标准化流程管控与智能化数据分析能力&#…...

3、食品包装控制系统 - /自动化与控制组件/food-packaging-control

76个工业组件库示例汇总 食品包装线控制系统 这是一个用于食品包装线控制系统的自定义组件&#xff0c;提供了食品包装生产线的可视化监控与控制界面。组件采用工业风格设计&#xff0c;包含生产流程控制、实时数据监控和逻辑编程三个主要功能区域。 功能特点 工业风格UI设…...

AbMole的Calcein-AM/PI细胞双染试剂盒,精准区分细胞活死状态

在细胞生物学研究中&#xff0c;细胞活性检测是基础且关键的实验环节。然而&#xff0c;传统方法在检测活细胞和死细胞时常常面临诸多挑战&#xff1a;例如&#xff0c;检测过程复杂、耗时&#xff0c;容易受到细胞类型和实验条件的限制&#xff1b;荧光信号不稳定&#xff0c;…...

力扣刷题Day 37:LRU 缓存(146)

1.题目描述 2.思路 方法1&#xff1a;直接用Python封装好的数据结构OrderedDict&#xff08;兼具哈希表与双向链表的数据结构&#xff09;。 方法2&#xff1a;哈希表辅以双向链表。 3.代码&#xff08;Python3&#xff09; 方法1&#xff1a; class LRUCache(collections…...

动态规划之01背包——三道题助你理解01背包

目录 二维数组实现 一维数组实现 例一P1164 小A点菜 P1048 [NOIP 2005 普及组] 采药 P1802 5 倍经验日 首先做动规很好的一个办法就是卡哥提出的动规五部曲个人觉得很好用 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 确定递推公式 dp数组如何初始化 确定遍…...

【前端笔记】CSS 选择器的常见用法

目录 1. CSS 的基本语法规范2. CSS 的引入方式3. CSS 选择器的种类3.1 标签选择器3.2 类选择器3.3 id 选择器3.4 复合选择器3.5 通配符选择器 4. 补充内容 1. CSS 的基本语法规范 选择器 {1 条 / n 条声明} 选择器决定的是修改谁声明决定的是怎么修改声明的属性是键值对&…...

电脑桌面悬浮窗便签,好用的电脑桌面便签工具

不知道大家有没有发现&#xff0c;我们每天要处理的事情越来越多&#xff1a;工作会议、项目截止日期、临时灵感、购物清单...光靠大脑记忆显然不够靠谱。你可能试过用手机备忘录&#xff0c;但工作时频繁切换设备又很影响效率。 这时候&#xff0c;一款好用的电脑桌面便签工具…...

Windows环境下maven的安装与配置

1.检查JAVA_HOME环境变量 Maven是使用java开发的&#xff0c;所以必须知道当前系统环境中的JDK的安装目录。 搜索栏直接输入“cmd” 或者 WinR 输入cmd 在打开的终端窗口输入“echo %JAVA_HOME”&#xff0c;就可以看到jdk的位置了。 如果没有的话&#xff0c;请参考我的文章&a…...

PyTorch 中如何针对 GPU 和 TPU 使用不同的处理方式

一个简单的矩阵乘法例子来演示在 PyTorch 中如何针对 GPU 和 TPU 使用不同的处理方式。 这个例子会展示核心的区别在于如何获取和指定计算设备&#xff0c;以及&#xff08;对于 TPU&#xff09;可能需要额外的库和同步操作。 示例代码&#xff1a; import torch import tim…...

数据库同步方案:构建企业数据流通的高速通道

在数字经济时代&#xff0c;数据已成为企业核心资产。根据Gartner统计&#xff0c;超过70%的企业因数据孤岛问题导致决策延迟&#xff0c;而高效可靠的数据库同步方案正是破解这一困局的关键技术。本文将深度解析数据库同步的核心逻辑、主流方案及实践策略&#xff0c;助企业构…...

微信小程序开发,登录注册实现

文章目录 1. 官方文档教程2. 注册实现3. 登录实现4. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/路由跳转的几种方式&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab…...