96SEO 2026-02-20 06:35 7
状态模式可以用来消除代码中大量的if-else结构#xff0c;它明确对象是有状态的、对象的不同状态对应的行为不一样、行为之间是可以切…状态模式

状态模式通常描述一个类不同行为的多个状态变更对象的行为依赖它的状态它是一种行为型模式。
状态模式可以用来消除代码中大量的if-else结构它明确对象是有状态的、对象的不同状态对应的行为不一样、行为之间是可以切换的。
简单来讲就是对象的状态只允许在某个或某些行为下发生改变否则不允许该行为操作对象状态。
未支付的订单只能被用户做支付或者取消操作已支付的订单只能被用户发货前催单
(按催单对象不同分为两种催单形式)已发货的订单只能被用户发货后催单已签收的订单只能被用户评价或删除已删除的订单用户已经看不到了无法做任何操作
总的来说就是用户订单的某个状态只能被用户的某个对应行为所改变而其他行为是无法操作的。
线上购物时的订单状态随着不同行为而变化营销活动的上线审批流程活动也是有状态变化的游戏时控制的角色在不同环境下有不同的状态buff加成或debuff时角色属性有不同的变化
以购物下单为例我们在OrderService里实现几个行为支付、取消订单、催单、判断是否可评价、删除订单这几个行为按一般的写法是这样的
}实现Service接口每个行为都需要判断在特定状态下才能操作
{System.out.println(pay-订单支付流程);orderDTO.setState(StateEnum.PAID);System.out.println(pay-订单支付成功);return
true;}System.out.println(pay-该订单无法支付当前状态为
orderDTO.getState().getName());return
{System.out.println(cancel-订单取消流程);orderDTO.setState(StateEnum.CANCEL);System.out.println(cancel-订单取消成功);return
true;}System.out.println(cancel-该订单无法取消当前状态为
orderDTO.getState().getName());return
{System.out.println(reminder-订单催单成功催单对象为卖家);return
{System.out.println(reminder-订单催单成功催单对象为物流);return
true;}System.out.println(reminder-该订单无法催单当前状态为
orderDTO.getState().getName());return
{System.out.println(evaluable-订单可以评价);return
true;}System.out.println(evaluable-该订单无法评价当前状态为
orderDTO.getState().getName());return
{System.out.println(delete-订单删除流程);orderDTO.setState(StateEnum.DELETED);System.out.println(delete-订单删除成功);return
true;}System.out.println(delete-订单无法删除当前状态为
orderDTO.getState().getName());return
OrderDTO();orderDTO.setOrderId(202400001);orderDTO.setState(StateEnum.UNPAID);OrderService
OrderServiceImpl();service.pay(orderDTO);service.pay(orderDTO);service.cancel(orderDTO);service.reminder(orderDTO);orderDTO.setState(StateEnum.DELIVERED);service.reminder(orderDTO);orderDTO.setState(StateEnum.SIGNED);service.isEvaluable(orderDTO);service.delete(orderDTO);}如上图代码所示这些代码的特点是OrderService下的每一方法即行为都需要考虑订单的各个状态业务逻辑相对来说复杂一些如果要增加一个新的订单状态每个方法都要按需调整扩展性不高不符合开闭原则。
我们在SpringBoot环境中使用状态模式重构以上的订单流程
首先需要引入另一组service用来表示订单状态的一组业务命名为OrderStateService提供与OrderService一致的行为方法
}再编写抽象业务实现接口的方法提供默认的实现默认实现都是该订单状态不支持该行为操作我们把真正的行为实现落地到具体的实现类上。
orderDTO.getState().getName());return
{log.info(cancel-该订单无法取消当前状态为{},
orderDTO.getState().getName());return
{log.info(reminder-该订单无法催单当前状态为{},
orderDTO.getState().getName());return
{log.info(evaluable-该订单无法评价当前状态为{},
orderDTO.getState().getName());return
{log.info(delete-该订单无法删除当前状态为{},
orderDTO.getState().getName());return
}再重写每个状态对应允许的行为操作一旦重写即表示该状态允许该行为操作
StateEnum.UNPAID;}Overridepublic
orderDTO.getState().getName());orderDTO.setState(StateEnum.PAID);return
{log.info(cancel-订单取消成功当前订单状态{},
orderDTO.getState().getName());orderDTO.setState(StateEnum.CANCEL);return
{log.info(delete-订单取消成功当前订单状态{},
orderDTO.getState().getName());orderDTO.setState(StateEnum.DELETED);return
orderDTO.getState().getName());return
StateEnum.DELIVERED;}Overridepublic
orderDTO.getState().getName());return
StateEnum.SIGNED;}Overridepublic
orderDTO.getState().getName());return
orderDTO.getState().getName());orderDTO.setState(StateEnum.DELETED);return
orderStateServiceSet;PostConstructpublic
{orderStateServiceSet.forEach(service
{stateMap.put(service.getState(),
stateMap.get(state);}}改造OrderService的实现类
orderStateFactory;Overridepublic
orderStateFactory.getOrderStateService(orderDTO.getState()).pay(orderDTO);}Overridepublic
orderStateFactory.getOrderStateService(orderDTO.getState()).cancel(orderDTO);}Overridepublic
orderStateFactory.getOrderStateService(orderDTO.getState()).reminder(orderDTO);}Overridepublic
orderStateFactory.getOrderStateService(orderDTO.getState()).isEvaluable(orderDTO);}Overridepublic
orderStateFactory.getOrderStateService(orderDTO.getState()).delete(orderDTO);}
applicationContext.getBean(orderServiceImpl);OrderDTO
OrderDTO();orderDTO.setOrderId(202400001);orderDTO.setState(StateEnum.UNPAID);service.pay(orderDTO);service.pay(orderDTO);service.cancel(orderDTO);service.reminder(orderDTO);orderDTO.setState(StateEnum.DELIVERED);service.reminder(orderDTO);orderDTO.setState(StateEnum.SIGNED);service.isEvaluable(orderDTO);service.delete(orderDTO);}可以看到重构后实现了相同的业务功能并且完全干掉了if-else的判断代码。
后续新增某个订单状态我们只需要扩展StateService的具体状态实现即可。
虽然整个模块的类增加了略显复杂但我们牺牲复杂性去换取高可维护性和扩展性是相当值得的。
在状态模式中我们把每一种状态都独立成一个类进行处理这满足了单一职责和开闭原则。
状态模式强调的是行为和状态的对应只有在特定的业务场景下使用它在通常三层架构的web开发中对象的状态和对象行为一般都是分离的所以在开发中我们使用地并不多。
状态模式和状态机也是有关系的状态机类似一种开发引擎便于我们在开发中使用它同样采用的是状态模式的思想实现的。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback