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

解锁状态模式:Java 编程中的行为魔法

系列文章目录
后续补充~~~


文章目录

  • 一、状态模式:概念与原理
  • 二、状态模式的深度剖析
    • (一)模式定义与核心思想
    • (二)模式结构与角色
  • 三、状态模式的实际应用场景
    • (一)电商系统中的订单状态管理
    • (二)游戏开发中的角色状态管理
    • (三)工作流系统中的任务状态管理
  • 四、Java 代码示例展示
    • (一)电商订单状态管理代码实现
    • (二)测试代码与运行结果
  • 五、状态模式的优缺点分析
    • (一)优点
    • (二)缺点
  • 六、状态模式与其他设计模式的协作
    • (一)与策略模式的比较与协作
    • (二)与观察者模式的结合应用
  • 七、总结与展望


一、状态模式:概念与原理

状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为,这个对象看起来像是改变了其类。这种模式的核心原理在于将对象的状态和行为解耦,把不同状态下的行为封装到独立的状态类中,使得对象的行为可以随着状态的变化而动态改变。

在日常生活中,有许多状态模式的例子。比如,一个交通信号灯,它有红灯、绿灯、黄灯三种状态。在不同的状态下,它的行为是不同的:红灯时,车辆和行人需要停止;绿灯时,车辆和行人可以通行;黄灯时,车辆和行人需要准备停止。又比如,一个手机,它有开机、关机、待机等状态。在开机状态下,手机可以拨打电话、发送短信、浏览网页等;在关机状态下,手机不能进行任何操作;在待机状态下,手机可以接收来电和短信,但不能进行其他操作。这些例子都体现了状态模式的核心思想:当对象的状态发生改变时,其行为也会相应地改变。
从代码实现的角度来看,状态模式主要包含三个角色:上下文(Context)、抽象状态(State)和具体状态(Concrete State)。

  • 上下文(Context):也称为环境角色,它定义了客户感兴趣的接口,维护一个当前状态的引用,并将与状态相关的操作委托给当前状态对象来处理。上下文是状态模式的核心,它负责管理状态的切换和状态对象的创建。
  • 抽象状态(State):定义一个接口,用以封装环境对象中的特定状态所对应的行为。抽象状态类是所有具体状态类的父类,它定义了所有具体状态类都必须实现的方法。
  • 具体状态(Concrete State):实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。具体状态类是抽象状态类的子类,它实现了抽象状态类中定义的方法,并且可以根据需要切换到其他状态。

以一个简单的电灯开关为例,电灯有开和关两种状态。在开状态下,按下开关,电灯会关闭;在关状态下,按下开关,电灯会打开。使用状态模式,可以将电灯的状态和行为解耦,使代码更加清晰和易于维护。首先定义一个抽象状态类State,其中包含一个抽象方法handle,用于处理开关操作。然后定义两个具体状态类OnState和OffState,分别实现State接口中的handle方法。在OnState类中,handle方法将状态切换为OffState,表示电灯关闭;在OffState类中,handle方法将状态切换为OnState,表示电灯打开。最后定义一个上下文类Light,它维护一个当前状态的引用,并提供一个request方法,用于处理开关操作。在request方法中,将调用当前状态对象的handle方法,从而实现状态的切换和行为的改变。

通过这个例子可以看出,状态模式通过将状态和行为封装到独立的类中,使得代码的结构更加清晰,易于扩展和维护。当需要添加新的状态时,只需要添加一个新的具体状态类,并实现抽象状态类中的方法即可,而不需要修改上下文类和其他具体状态类的代码。这符合开闭原则,提高了代码的可维护性和可扩展性。


二、状态模式的深度剖析

(一)模式定义与核心思想

状态模式,其定义为:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。从本质上讲,状态模式的核心思想在于巧妙地将对象的状态与行为进行解耦。传统编程中,对象的行为往往通过大量的条件判断语句(如if - else或switch - case)来根据不同状态进行处理,这使得代码中状态判断逻辑与行为逻辑紧密交织,导致代码的可读性、可维护性和可扩展性都较差。

而状态模式通过将每个状态对应的行为封装到独立的状态类中,实现了状态与行为的分离。当对象的状态发生变化时,只需切换到对应的状态类,对象的行为就会自动根据新的状态进行调整。这就好比一个人在不同的生活场景(状态)下会有不同的行为表现:在工作场景中,会专注于工作任务,展现出专业的工作行为;在休闲场景中,会放松身心,进行娱乐活动等。状态模式就像是为对象的不同 “生活场景” 都定义了独立的 “行为准则”,使得对象在不同状态下的行为更加清晰、易于管理。

这种解耦方式带来了诸多好处。一方面,它极大地提高了代码的可维护性。当需要修改某个状态下的行为时,只需在对应的状态类中进行修改,而不会影响到其他状态的行为代码,也不会干扰到整个系统中与状态判断相关的复杂逻辑。另一方面,它增强了代码的可扩展性。当需要添加新的状态时,只需创建一个新的具体状态类,实现相应的行为接口,而不需要对原有的大量条件判断代码进行大规模修改,符合软件开发中的开闭原则。

(二)模式结构与角色

  1. 上下文(Context):上下文在状态模式中扮演着至关重要的桥梁角色。它对外为客户端提供统一的接口,使得客户端无需了解内部复杂的状态变化细节,只需通过上下文来与整个状态系统进行交互。同时,上下文内部维护着一个当前状态对象的引用,这个引用就像是一个指向当前 “行为准则” 的指针,决定了对象在当前状态下的行为表现。

当上下文接收到客户端的请求时,它并不会直接处理请求,而是将请求委托给当前所引用的状态对象。例如,在一个手机的状态管理系统中,手机就是上下文,它可能有开机、关机、待机、通话等状态。当用户按下手机的某个按键(发出请求)时,手机(上下文)会根据当前所处的状态(如待机状态),将按键操作请求委托给待机状态对应的状态对象,由该状态对象来处理具体的按键响应行为,比如显示时间、接收短信提示等。上下文的这种委托机制,使得状态对象能够专注于实现特定状态下的行为逻辑,而上下文则专注于状态的管理和请求的转发,两者分工明确,协作紧密,共同构建起高效的状态管理体系。

  1. 抽象状态类(State):抽象状态类是整个状态模式的行为规范核心。它定义了一系列通用的行为接口,这些接口描述了对象在不同状态下可能执行的操作。虽然抽象状态类本身并不实现具体的行为逻辑,但它为所有具体状态类提供了一个统一的抽象模板,确保了所有具体状态类在行为定义上的一致性。

例如,在一个图形绘制工具的状态管理中,抽象状态类可能定义了 “绘制图形”“选择图形”“移动图形” 等通用行为接口。无论图形绘制工具处于画笔状态、选择工具状态还是移动工具状态,这些状态对应的具体状态类都必须实现抽象状态类中定义的这些行为接口,以保证在不同状态下,用户对于图形绘制和操作的基本功能需求都能得到满足。通过这种方式,抽象状态类为整个状态模式提供了一个稳定的行为框架,使得具体状态类的实现有章可循,也方便了开发人员在维护和扩展系统时,能够快速了解和把握各个状态下对象的行为规范。

  1. 具体状态类(ConcreteState):具体状态类是状态模式中行为实现的具体载体。每个具体状态类都继承自抽象状态类,并实现了抽象状态类中定义的行为接口。在实现过程中,具体状态类会根据自身所代表的特定状态,编写符合该状态逻辑的具体行为代码。

例如,在一个电商订单的状态管理系统中,订单可能有 “待支付”“已支付”“已发货”“已完成” 等状态。“待支付” 状态对应的具体状态类会实现抽象状态类中与订单待支付相关的行为接口,如显示支付金额、提供支付方式选择、处理支付请求等;“已发货” 状态对应的具体状态类则会实现与订单发货相关的行为,如显示物流信息、处理收货确认等。通过这种方式,不同的具体状态类实现了对象在不同状态下的独特行为,使得系统能够根据订单的实际状态,准确地执行相应的业务逻辑,为用户提供符合预期的服务体验。同时,这种将不同状态行为分离到具体状态类中的方式,也使得代码结构更加清晰,易于理解和维护,当需要修改或扩展某个状态下的行为时,只需在对应的具体状态类中进行操作,而不会对其他状态的功能造成影响。

三、状态模式的实际应用场景

(一)电商系统中的订单状态管理

订单状态分析

在电商系统里,订单状态贯穿购物全流程。“未支付” 是初始状态,用户下单未付款时订单处于此态,此时订单信息生成但商品资源未占用,系统设支付时效,超时或自动取消。用户成功支付后,订单变 “已支付”,商品被预订保留,系统准备发货,包括调配库存、安排物流等。商品从仓库出库交由物流运输,订单进入 “已发货” 状态,用户可追踪物流位置和预计送达时间。用户收货确认无误,订单更新为 “已完成”,标志购物流程结束,系统总结归档交易数据、统计业绩,还可能邀用户评价以优化业务。此外,还有 “部分发货”“退货申请中”“退款中” 等特殊状态,反映购物中的复杂情况。

状态模式优势

用状态模式管理订单状态,大幅简化相关逻辑。传统方式常需在大量业务代码中用复杂条件判断(如 if - else、switch - case)处理不同状态操作,导致代码结构混乱、难维护扩展。状态模式将各订单状态行为封装在独立状态类中,各状态类专注实现自身业务逻辑。如 “未支付” 类处理支付相关操作,“已发货” 类处理物流展示更新和收货确认等。订单状态变化时,切换对应状态类,系统自动执行行为逻辑,无需在大量代码中找和改状态判断逻辑,提升代码可读性和可维护性,增强扩展性。添加新状态(如 “换货中”)时,创建新状态类实现行为接口,不影响原有状态类和业务逻辑,符合开闭原则,为电商系统发展和功能升级提供保障。

(二)游戏开发中的角色状态管理

角色状态示例

在动作冒险游戏这类游戏开发中,角色状态多样,丰富了玩法和趣味性。“空闲” 是角色默认状态,此时静止等待,有轻微呼吸、摆动身体等待机动作,资源消耗少,系统等玩家指令。玩家按移动键,角色进入 “奔跑” 状态,快速移动呈奔跑姿态,有脚步声、灰尘特效,体力或能量值随奔跑消耗,画面也相应滚动变化。按下跳跃键,角色触发 “跳跃” 状态,做出跳跃动作,受重力影响轨迹,跳跃中无法攻击等,落地后状态依操作或条件转换。角色遇敌按攻击键,进入 “攻击” 状态,执行挥剑、发射魔法等动作伤敌,有攻击特效、音效,且动作因武器类型、技能等级而异。

状态模式的应用

状态模式在游戏角色状态管理中很关键,将角色不同状态封装成独立状态类,实现行为切换。各状态类实现对应行为逻辑,如 “奔跑” 状态类有移动、体力消耗、动画播放逻辑;“攻击” 状态类有攻击动作执行、伤害计算、特效展示逻辑等。角色状态变化时,游戏系统切换到相应状态类,自动执行该状态行为。如从 “空闲” 到 “奔跑”,系统调用 “奔跑” 状态类方法,执行奔跑动作、更新位置、播放音效,无需复杂条件判断和行为处理。这增强了游戏交互性和趣味性,玩家能流畅控制角色,也方便开发者管理维护角色状态和行为。添加新状态(如 “潜行”)时,开发者创建新状态类,实现降低脚步声、隐藏身形等 “潜行” 行为逻辑,不干扰原有状态和游戏逻辑,利于游戏内容扩展和玩法创新。

(三)工作流系统中的任务状态管理

任务状态流转

在工作流系统里,任务状态流转和业务流程紧密相关,体现任务不同阶段进展。任务起始为 “待处理” 状态,系统已接收任务信息,但未分配给处理人员,处理流程也未启动。任务分配给特定人员或系统模块后,变为 “处理中” 状态,此阶段处理人员或系统按任务要求和规则执行操作,如数据录入、文件审批等,系统还会记录处理进度和相关信息。当任务处理完毕且符合完成标准,状态更新为 “已完成”,这时系统会验证、归档任务结果,通知相关人员,存储统计任务数据,为业务分析和决策提供依据。不过,若因需求变更、资源不足等原因任务被取消,状态就变为 “已取消”,系统停止处理,回滚或清理已做操作,如释放资源、撤销部分已提交数据。

状态模式的价值

状态模式对工作流系统意义重大,能保障工作流顺畅运行。它把每个任务状态对应的行为封装在独立状态类中,系统依任务当前状态自动执行处理逻辑。像 “待处理” 状态类实现任务分配、通知相关人员逻辑;“处理中” 状态类实现业务处理、进度更新逻辑;“已完成” 状态类实现结果验证、数据归档逻辑等。这让工作流系统逻辑更清晰,状态转换更明确可控。同时,状态模式提升了系统灵活性和可配置性。业务流程变化或需调整任务状态处理逻辑时,开发者只需修改或扩展对应状态类,不影响系统其他部分。比如要新增 “待审核” 任务状态,创建新状态类,实现显示审核信息、通知审核人员等逻辑,集成到系统中,就能支持新业务流程,无需大规模重构系统,增强了系统适应性和可维护性,为企业业务发展和流程优化助力。


四、Java 代码示例展示

(一)电商订单状态管理代码实现

  1. 定义状态接口
    在 Java 中,首先定义一个订单状态接口OrderState,它包含了订单在不同状态下可能执行的操作方法,如支付、发货、取消等。这些方法将由具体的状态类来实现,从而实现不同状态下订单行为的差异化处理。
// 订单状态接口
public interface OrderState {// 处理支付操作void handlePayment(Order order);// 处理发货操作void handleShipment(Order order);// 处理取消操作void handleCancellation(Order order);
}
  1. 实现具体状态类
  • 未支付状态类(PendingPaymentState):当订单处于未支付状态时,实现OrderState接口中的方法。在handlePayment方法中,处理支付成功后的逻辑,如更新订单状态为已支付,并输出相应的提示信息;在handleShipment和handleCancellation方法中,根据业务逻辑,输出当前状态下不允许执行该操作的提示。
// 未支付状态类
public class PendingPaymentState implements OrderState {@Overridepublic void handlePayment(Order order) {System.out.println("订单支付成功,正在处理发货...");order.setState(new PaidState());}@Overridepublic void handleShipment(Order order) {System.out.println("订单未支付,无法发货。");}@Overridepublic void handleCancellation(Order order) {System.out.println("订单取消成功,已取消未支付订单。");order.setState(new CancelledState());}
}
  • 已支付状态类(PaidState):订单支付成功后进入此状态。在handleShipment方法中,处理发货逻辑,更新订单状态为已发货并输出提示;在handlePayment方法中,提示订单已支付无需重复操作;handleCancellation方法则处理支付后取消订单的逻辑,如退款操作等,并更新订单状态为已取消。
// 已支付状态类
public class PaidState implements OrderState {@Overridepublic void handlePayment(Order order) {System.out.println("订单已支付,无需重复支付。");}@Overridepublic void handleShipment(Order order) {System.out.println("订单已发货,等待客户确认...");order.setState(new ShippedState());}@Overridepublic void handleCancellation(Order order) {System.out.println("正在处理退款,订单已取消。");order.setState(new CancelledState());}
}
  • 已发货状态类(ShippedState):订单发货后处于此状态。handleShipment方法提示订单已发货;handlePayment方法提示支付已完成;在handleCancellation方法中,根据业务规则,可能不允许在已发货状态下取消订单,所以输出相应提示。
// 已发货状态类
public class ShippedState implements OrderState {@Overridepublic void handlePayment(Order order) {System.out.println("订单已支付,无需再次支付。");}@Overridepublic void handleShipment(Order order) {System.out.println("订单已发货,请勿重复发货。");}@Overridepublic void handleCancellation(Order order) {System.out.println("订单已发货,无法取消。请联系客服处理退货。");}
}
  1. 创建上下文类
    订单上下文类Order负责管理订单状态的切换和行为的委托。它包含一个OrderState类型的成员变量state,用于表示当前订单的状态。通过setState方法可以切换订单状态,而handlePayment、handleShipment和handleCancellation方法则将具体的操作委托给当前状态对象来处理。
// 订单上下文类
public class Order {private OrderState state;public Order() {// 初始状态为未支付this.state = new PendingPaymentState();}public void setState(OrderState state) {this.state = state;}public void handlePayment() {state.handlePayment(this);}public void handleShipment() {state.handleShipment(this);}public void handleCancellation() {state.handleCancellation(this);}
}

(二)测试代码与运行结果

  1. 编写测试代码
    通过编写测试代码来模拟订单状态的变化和行为的执行,从而验证状态模式的正确性和有效性。在测试代码中,创建一个Order对象,然后依次调用不同的操作方法,观察订单状态的变化和相应的输出结果。
public class OrderTest {public static void main(String[] args) {Order order = new Order();// 模拟支付操作order.handlePayment();// 模拟发货操作order.handleShipment();// 模拟取消操作(已发货状态下尝试取消)order.handleCancellation();// 再次模拟支付操作(已发货状态下尝试支付)order.handlePayment();}
}
  1. 分析运行结果
    运行上述测试代码,输出结果如下:
订单支付成功,正在处理发货...
订单已发货,等待客户确认...
订单已发货,无法取消。请联系客服处理退货。
订单已支付,无需再次支付。

从运行结果可以看出,当调用handlePayment方法时,订单从未支付状态成功转换为已支付状态,并输出相应的支付成功和发货提示;接着调用handleShipment方法,订单从已支付状态转换为已发货状态,并输出发货提示;当在已发货状态下调用handleCancellation方法时,由于业务规则限制,输出无法取消的提示;最后在已发货状态下调用handlePayment方法,输出已支付无需再次支付的提示。这表明状态模式能够正确地管理订单状态的转换和行为的执行,符合预期的业务逻辑,验证了状态模式在电商订单状态管理中的正确性和有效性。

五、状态模式的优缺点分析

(一)优点

  1. 结构清晰:状态模式将与特定状态相关的行为都封装在一个状态对象中,使得代码结构更加清晰。通过将状态和行为分离,每个状态类专注于实现自身状态下的业务逻辑,避免了将所有状态相关的逻辑混杂在一个庞大的类中。以电商订单状态管理为例,“未支付”“已支付”“已发货”“已取消” 等每个状态都有对应的状态类,每个状态类中的代码只负责处理该状态下的操作,如支付、发货、取消等,使得代码的组织结构一目了然,开发人员能够快速定位和理解不同状态下的业务逻辑,大大提高了代码的可读性和可维护性。

  2. 易于扩展:符合开闭原则,当需要添加新的状态时,只需创建一个新的具体状态类,实现抽象状态类中定义的行为接口即可。这一过程无需修改现有代码,只需要在上下文类中添加对新状态类的引用和切换逻辑。例如,在游戏角色状态管理中,如果要添加一个新的 “隐身” 状态,开发人员只需创建一个 “隐身状态类”,实现该状态下角色的行为逻辑,如不被敌人发现、特殊的移动速度和攻击方式等,然后在角色上下文类中添加相应的状态切换逻辑,就可以轻松实现新状态的添加,而不会对原有的其他状态类和游戏逻辑造成影响,为系统的功能扩展提供了极大的便利。

  3. 可维护性强:状态模式减少了大量的条件判断语句。在传统的编程方式中,处理对象不同状态下的行为往往需要使用复杂的if - else或switch - case语句,这些语句不仅使代码冗长,而且容易出错,维护起来非常困难。而状态模式通过将每个状态的行为封装在独立的状态类中,当需要修改某个状态下的行为时,只需在对应的状态类中进行修改,不会影响到其他状态的代码,也无需在大量的条件判断语句中查找和修改相关逻辑,从而降低了代码的维护成本,提高了系统的可维护性。比如在工作流系统中,任务状态的处理使用状态模式后,当业务规则发生变化需要修改某个任务状态的处理逻辑时,只需要在对应的状态类中进行调整,而不会对整个工作流系统的其他部分造成干扰,使得系统的维护更加高效和可靠。

(二)缺点

  1. 类数量增加:状态模式的使用必然会导致系统中类的数量增多。因为每个状态都需要一个对应的具体状态类来实现其行为,当状态数量较多时,类的数量会显著增加。例如,在一个具有多种复杂状态的系统中,如一个大型游戏中角色可能有几十种不同的状态,包括各种技能状态、战斗状态、装备状态等,这就需要创建大量的具体状态类来处理这些状态下的行为。类数量的增加会使系统的结构变得复杂,增加了开发人员对系统整体架构的理解难度,同时也会增加代码的管理和维护成本,例如在进行代码审查、调试和版本控制时,需要处理更多的类文件。

  2. 复杂度提升:在简单场景下,使用状态模式可能会引入不必要的复杂性。对于一些简单的对象状态管理,可能只需要少量的条件判断语句就能清晰地处理不同状态下的行为,此时使用状态模式反而会增加代码的复杂度,因为需要定义抽象状态类、多个具体状态类以及上下文类,增加了代码的层级和结构复杂度。例如,一个简单的开关控制对象,只有 “开” 和 “关” 两种状态,使用简单的条件判断语句(如if - else)就可以轻松实现状态的切换和行为的处理,而引入状态模式则需要创建抽象状态类、“开状态类”“关状态类” 以及上下文类等,使得代码变得繁琐复杂,增加了开发和维护的工作量,这种情况下使用状态模式可能得不偿失 。


六、状态模式与其他设计模式的协作

(一)与策略模式的比较与协作

  1. 模式比较

    • 状态模式和策略模式结构相似,都封装行为并通过委托调用。但适用场景和实现方式不同。
    • 适用场景:状态模式用于对象状态变化导致行为变化,如电商订单从 “未支付” 到 “已支付” 等状态转变,各状态行为不同。策略模式侧重不同业务逻辑或算法选择,如图形绘制工具中不同图形绘制算法的选择。
    • 实现方式:状态模式中具体状态类常持有上下文对象引用,用于状态转换。如订单支付成功后切换状态。策略模式中策略类与上下文对象相对独立,上下文组合持有策略实例并调用算法,如绘制工具根据选择调用绘制策略。
  2. 协作应用

    • 在复杂场景下,两者可结合。如智能物流系统,货物运输状态管理用状态模式,如 “在途”“已到达中转站” 等状态对应不同操作。运输方式选择用策略模式,根据货物因素选公路、铁路、航空等运输方式及策略,提高系统灵活性和扩展性。

(二)与观察者模式的结合应用

  1. 结合原理

    • 状态模式与观察者模式结合,当对象状态变化,不仅改变自身行为,还通知依赖对象响应。
    • 上下文对象作为被观察主题,维护观察者列表。状态变化时,调用通知方法遍历列表让观察者更新。如实时监控系统中,被监控对象(上下文)状态变化通知监控组件(观察者),被监控对象还能执行自身行为逻辑。
  2. 应用场景

    • 在实时交互和状态更新场景可同时使用。如在线游戏,游戏角色用状态模式管理 “空闲”“战斗”“死亡” 等状态及行为。游戏其他组件(玩家界面、队友信息显示)作为观察者,角色状态变化时获取信息并更新,如角色 “战斗” 时界面和队友信息显示相应调整,提高系统性能和扩展性。

七、总结与展望

状态模式作为一种强大的行为型设计模式,在软件开发中展现出了独特的魅力和重要的价值。它通过将对象的状态与行为进行解耦,使得代码结构更加清晰、易于维护和扩展,有效地解决了传统编程中状态判断逻辑与行为逻辑紧密耦合所带来的诸多问题。

在实际应用中,状态模式广泛应用于电商系统、游戏开发、工作流系统等多个领域,为这些系统的高效运行和功能扩展提供了有力支持。以电商系统中的订单状态管理为例,状态模式能够清晰地处理订单在不同状态下的业务逻辑,使得订单的支付、发货、取消等操作更加规范和易于管理;在游戏开发中,它为角色状态的多样化和灵活切换提供了保障,增强了游戏的交互性和趣味性;在工作流系统中,状态模式确保了任务状态的顺利流转,提高了工作流的自动化和智能化水平。

同时,状态模式与策略模式、观察者模式等其他设计模式的协作,进一步拓展了其应用场景和功能边界,为解决复杂的业务问题提供了更多的可能性。通过与策略模式结合,能够在不同状态下灵活选择合适的业务逻辑或算法;与观察者模式结合,则可以实现状态变化时的实时通知和交互,提升系统的响应性和用户体验。

然而,状态模式也并非完美无缺,它存在类数量增加、在简单场景下可能引入不必要复杂性等缺点。但这并不影响其在众多复杂场景中的广泛应用。在实际项目开发中,我们需要根据具体的业务需求和场景特点,综合考虑状态模式的优缺点,合理地运用这一设计模式。

展望未来,随着软件开发技术的不断发展和业务需求的日益复杂,状态模式将在更多领域发挥重要作用。同时,我们也期待状态模式能够与新兴技术(如人工智能、大数据、区块链等)相结合,创造出更多创新的应用场景和解决方案。作为开发者,我们应不断深入学习和研究状态模式以及其他设计模式,提升自己的设计能力和编程水平,在实际项目中灵活运用这些设计模式,打造出更加高质量、可维护和可扩展的软件系统,为推动软件开发行业的发展贡献自己的力量。

相关文章:

解锁状态模式:Java 编程中的行为魔法

系列文章目录 后续补充~~~ 文章目录 一、状态模式:概念与原理二、状态模式的深度剖析(一)模式定义与核心思想(二)模式结构与角色 三、状态模式的实际应用场景(一)电商系统中的订单状态管理&…...

算法与数据结构(相交链表)

题目 思路 1.哈希集合 因为要求是否存在相交节点,那么我们就可以利用哈希集合先将listA链表里面的所有数据存入,然后访问listB,判断其是否有节点在哈希集合中,若存在,则说明此节点为相交的节点。若遍历完之后仍没有发…...

浅入浅出Selenium DevTools

前言 在自动化测试领域,Selenium一直是主流工具之一。随着前端技术的不断发展,浏览器的功能也在不断丰富。 Selenium 3版本前,一套通用的采集流程如上图所示: 打开Charles,设置Session自动导出频次及导出路径Seleniu…...

软件工程---净室软件工程

净室软件工程是一种软件开发方法,旨在通过形式化的数据和严格的测试来提高软件的可靠性和减少缺陷的数量。它的核心思想是在软件开发过程中最小化或消除软件缺陷,从而提高软件的质量和可靠性。这种方法强调在软件生命周期的早期阶段使用形式化方法进行规…...

OpenHarmony图形子系统

OpenHarmony图形子系统 图形子系统主要包括UI组件、布局、动画、字体、输入事件、窗口管理、渲染绘制等模块,构建基于轻量OS应用框架满足硬件资源较小的物联网设备或者构建基于标准OS的应用框架满足富设备的OpenHarmony系统应用开发。 1.1 轻量系统 简介 图形子…...

如何获取Mac OS 安装盘

发现虚拟机VirtualBox支持Mac虚拟,就想尝试一下。但是发现Mac的安装盘特别难拿到,因此留档。发现有几种方法,最简单的方法,是在有Mac 机器的情况下,直接到App Store里,根据Mac版本的名字查找并下载。另外还…...

【弹性计算】弹性裸金属服务器和神龙虚拟化(一):功能特点

弹性裸金属服务器和神龙虚拟化(一):功能特点 特征一:分钟级交付特征二:兼容 VPC、SLB、RDS 等云平台全业务特征三:兼容虚拟机镜像特征四:云盘启动和数据云盘动态热插拔特征五:虚拟机…...

大白话前端性能优化方法的分类与具体实现

大白话前端性能优化方法的分类与具体实现 一、资源加载优化 1. 压缩与合并文件 大白话解释: 咱们的网页代码里,就像一个房间堆满了东西,有很多没用的“杂物”,比如代码里的空格、注释啥的。压缩文件就是把这些“杂物”清理掉&a…...

Rabbit MQ 高频面试题【刷题系列】

文章目录 一、公司生产环境用的什么消息中间件?二、Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点?三、解耦、异步、削峰是什么?四、消息队列有什么缺点?五、RabbitMQ一般用在什么场景?六、简单说RabbitMQ有哪些角…...

ES6 特性全面解析与应用实践

1、let let 关键字用来声明变量,使用let 声明的变量有几个特点: 1) 不允许重复声明 2) 块儿级作用域 3) 不存在变量提升 4) 不影响作用域链 5) 暂时性死区 6)不与顶级对象挂钩 在代码块内,使用let命令声明变量之前&#x…...

有关数据库表的冗余字段

有关数据库表的冗余字段 之前看一个开发人员的技术研讨视频,提到了一个数据库表设计中的表拆分字段冗余问题,就是一张表做纵向分表,拆分为a和b以做冷热数据分离存储,但是会有一种情况就是相同的字段值在a,b表中重复出现…...

知识图谱补全KGC

目录 基础知识知识图谱补全概念性能指标 一、翻译模型的知识图谱补全1.TransE2.TransH3.RotatE 二、张量分解的知识补全1.RESCAL2.ComplEx 三、神经网络的知识图谱补全1.卷积神经网络CNN(一般用于二维图像处理)ConvE 2.循环神经网络RNN3.图神经网络GNN1&…...

独立开发者的内容营销教程

内容营销对于独立开发者来说,是一种低成本、高效的方式来推广产品、建立品牌影响力和吸引潜在用户。通过分享有价值、相关性强的内容,您可以吸引用户的注意力,增强用户黏性,并最终将他们转化为忠实用户或客户。以下是详细的独立开…...

Mysql——约束与多表查询

一、约束 1.1定义 约束是对表中的数据进行限制的一套规则,用于防止用户向数据库中输入无效数据。它可以保证表中的数据满足特定业务规则和逻辑,从而维护数据的准确性和可靠性。 1.2作用 数据完整性 :约束可以确保数据在插入、更新或删除时符…...

DockerでOracle Database 23ai FreeをセットアップしMAX_STRING_SIZEを拡張する手順

DockerでOracle Database 23c FreeをセットアップしMAX_STRING_SIZEを拡張する手順 はじめに環境準備ディレクトリ作成Dockerコンテナ起動 データベース設定変更コンテナ内でSQL*Plus起動PDB操作と文字列サイズ拡張設定検証 管理者ユーザー作成注意事項まとめ はじめに Oracle…...

Unity 运用正则表达式保留字符串中的中文英文字母和数字

正则表达 正则表达式 – 语法 | 菜鸟教程 Regex 类 (System.Text.RegularExpressions) | Microsoft Learn 保留字符串中的中英数 中英数的正则表达。 patten "[\u4e00-\u9fa5A-Za-z0-9]"; 使用Regex 类匹配正则并保留。 matches Regex.Matches(str, patten)…...

vue el-table-column 单元表格的 省略号 实现

要对 el-table-column 的某一列中的每个单元格值进行处理,使其在文本内容超出指定宽度时显示省略号(…),可以通过以下方法实现: 使用 scoped slots:利用 Element UI 提供的 scoped slots 自定义单元格内容…...

企业微信里可以使用的企业内刊制作工具,FLBOOK

如何让员工及时了解公司动态、行业资讯、学习专业知识,并有效沉淀企业文化?一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网,注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…...

【数据挖掘】Pandas

Pandas 是 Python 进行 数据挖掘 和 数据分析 的核心库之一,提供了强大的 数据清洗、预处理、转换、分析 和 可视化 功能。它通常与 NumPy、Matplotlib、Seaborn、Scikit-Learn 等库结合使用,帮助构建高效的数据挖掘流程。 📌 1. 读取数据 P…...

explore与explode词源故事

英语单词explore来自古法语,源自拉丁语,由前缀ex-(出来)加词根plor-(叫喊)以及末尾的小尾巴-e组成,字面意思就是“喊出来,通过叫喊声赶出来”。它为什么能表示“探索”呢&#xff1f…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目

应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起,为了跨网段推流,千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...

【threejs】每天一个小案例讲解:创建基本的3D场景

代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...

MySQL基本操作(续)

第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除

目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作&#xf…...