解锁状态模式:代码世界的“变形金刚”

目录

一、开篇引入

二、什么是状态模式

(一)定义与原理

(二)核心组件

三、状态模式的应用场景

(一)订单状态管理

(二)游戏角色状态

(三)音视频播放器

四、状态模式的代码实现

(一)以订单系统为例

(二)代码示例解析

五、状态模式与其他设计模式的区别

(一)与策略模式的对比

(二)与其他相关模式的简要对比

六、状态模式的优缺点

(一)优点

(二)缺点

七、总结与展望

(一)回顾重点

(二)鼓励实践


一、开篇引入

        不知道大家有没有过这样的经历,当我们的手机电量充足时,可以随意地刷视频、玩游戏、畅聊微信;但当电量只剩下 1% 时,手机仿佛开启了 “省电模式”,不仅自动降低屏幕亮度,还会限制一些后台程序的运行,甚至连震动反馈都消失了。同样是一部手机,仅仅因为电量状态的不同,行为表现就截然不同 。这种因状态而异的行为,在软件设计中也屡见不鲜。今天,咱们就一起来深入探讨一种能够优雅处理这类问题的设计模式 —— 状态模式(State Pattern)。

二、什么是状态模式

(一)定义与原理

        状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为 ,对象看起来似乎修改了它的类。这种模式的核心在于将对象的状态和行为分离,每个状态都被封装成一个独立的类,当对象的状态发生变化时,就切换到相应的状态类,从而改变对象的行为。

        举个简单的例子,就像我们玩游戏时,游戏角色可能有不同的状态,比如正常状态、奔跑状态、跳跃状态、战斗状态等。在不同的状态下,角色的行为是不一样的。正常状态下,角色可能只是缓慢行走;奔跑状态下,角色移动速度加快;跳跃状态下,角色会做出跳跃动作;战斗状态下,角色会攻击敌人或者躲避攻击。如果不使用状态模式,我们可能需要在一个庞大的角色类中,通过大量的条件判断语句(如 if - else 或 switch - case)来处理不同状态下的行为,这样代码会变得非常复杂且难以维护。而状态模式则将每个状态的行为封装到对应的状态类中,使得代码结构更加清晰,易于扩展和维护 。

(二)核心组件

  1. Context(环境类):也被称为上下文类,它是拥有多种状态的对象。环境类维护一个对当前状态对象的引用,这个引用指向的是具体状态类的实例,通过这个引用,环境类可以调用当前状态对象的方法,从而实现与状态相关的操作。同时,环境类还定义了一些方法,这些方法可以供客户端调用,客户端通过调用环境类的这些方法,间接与状态对象进行交互。例如,在游戏角色的例子中,环境类就是游戏角色本身,它持有当前状态(如正常状态、奔跑状态等)的引用,并且提供一些方法,如移动、攻击等,这些方法的具体行为会根据当前状态的不同而不同。

  2. State(抽象状态类):定义了一个接口,这个接口封装了与环境类的一个特定状态相关的行为。在抽象状态类中,声明了一系列抽象方法,这些方法代表了在该状态下可能执行的操作。具体状态类都必须实现这个接口,实现这些抽象方法,以提供具体的行为实现。抽象状态类就像是一个模板,为所有具体状态类提供了统一的行为规范,使得不同的具体状态类之间具有一致性和可替代性。

  3. ConcreteState(具体状态类):是抽象状态类的子类,每个具体状态类对应环境类的一个具体状态。具体状态类实现了抽象状态类中定义的接口方法,实现了在该具体状态下的具体行为。在实现行为的过程中,具体状态类还可以根据需要决定是否进行状态转换。如果满足一定的条件,具体状态类可以通过调用环境类的方法,将环境类的当前状态切换到另一个状态,从而实现状态的转换。比如在游戏角色的奔跑状态类中,实现了奔跑的行为,并且当角色遇到障碍物时,可以通过调用环境类的方法,将角色的状态切换到跳跃状态 。

三、状态模式的应用场景

(一)订单状态管理

        在电商系统中,订单状态管理是状态模式的典型应用场景。一个订单从创建到完成,会经历多个不同的状态,如新建、待支付、支付成功、已发货、已完成、已取消等 。每个状态下,订单的行为和可执行的操作都有所不同。

        以新建状态为例,此时订单刚刚创建,用户可以进行支付操作,也可以取消订单。如果用户选择支付,订单状态就会转换为待支付状态;若用户取消订单,订单则进入已取消状态 。在待支付状态下,如果用户完成支付,订单状态变为支付成功,系统开始处理订单发货事宜;若支付超时,订单会自动取消,状态转变为已取消。当订单处于已发货状态时,用户可以查看物流信息,但无法再进行支付或取消订单的操作,直到用户确认收货,订单状态才会更新为已完成 。

        通过状态模式,我们可以将每个订单状态的行为封装到对应的状态类中,使代码结构更加清晰,易于维护和扩展。当需要添加新的订单状态或修改某个状态的行为时,只需创建新的状态类或修改相应状态类的方法,而不会影响到其他状态的代码。例如,若电商平台新增了 “部分退款” 的订单状态,我们只需创建一个新的 “部分退款状态类”,实现该状态下订单的特有行为,如显示退款金额、限制部分操作等,而不会对已有的 “已完成”“已取消” 等状态类造成影响。

(二)游戏角色状态

        在游戏开发中,游戏角色的状态管理也离不开状态模式。游戏角色通常会有多种状态,如待机、行走、奔跑、跳跃、攻击、受伤、死亡等 。不同状态下,角色的行为表现截然不同。

        当角色处于待机状态时,它可能只是静静地站在原地,偶尔做一些小动作,如晃悠一下身体、调整一下姿势等。一旦玩家按下移动键,角色状态切换为行走或奔跑状态,此时角色会根据玩家的操作在游戏场景中移动,并且移动速度和动画效果会根据行走或奔跑状态而有所不同 。当玩家按下攻击键时,角色进入攻击状态,执行相应的攻击动作,如挥剑、开枪等,同时可能会播放攻击音效和特效 。如果角色受到敌人的攻击,生命值下降,就会进入受伤状态,此时角色可能会出现痛苦的表情和动作,移动速度也可能会减慢 。当角色的生命值降为 0 时,便进入死亡状态,角色会倒下,停止一切动作,游戏可能会触发相应的结算或复活机制 。

        使用状态模式来管理游戏角色状态,能够让游

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雨淅淅编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值