设计模式-06

举报
kwan的解忧杂货铺 发表于 2024/05/15 06:38:17 2024/05/15
【摘要】 六.订单状态模块 1.状态模式State——抽象状态角色(Enum 完成) 接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。ConcreteState——具体状态角色 (状态变化 Enum) 每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,通俗地说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。Context——环境角色 (用户触发 – 》 con...

六.订单状态模块

1.状态模式

  • State——抽象状态角色(Enum 完成) 接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。

  • ConcreteState——具体状态角色 (状态变化 Enum) 每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,通俗地说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。

  • Context——环境角色 (用户触发 – 》 controller + service) 定义客户端需要的接口,并且负责具体状态的切换。

image-20230729201102956

2.观察者模式

观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe)

  • Subject 被观察者 定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。

  • ConcreteSubject 具体的被观察者 定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。

  • Observer 观察者 观察者接收到消息后,即进行 update(更新方法)操作,对接收到的信息进行处理。

  • ConcreteObserver 具体的观察者

image-20230729201230013

s 是状态,e 是操作类型

public class StateMachineConfigurerAdapter<S, E> extends AbstractStateMachineConfigurerAdapter<S, E> {
    public StateMachineConfigurerAdapter() {
    }
}

3.状态模式 + 观察者模式(监听器模式)

模式作用:

  • 状态模式:状态动态变更;
  • 观察者模式:观察状态变更,并出发相应

项目需求概述:用户从开始下订单,到支付完成,再到物流部进行发货,最终用户确认收货,整个流程涉及到很多订单状态,需要通过代码对订单状态进行管理。除此之外,用户或者物流部门每一次触发的不同操作都有可能改变订单状态。

如:用户创建订单操作 导致 订单状态为 待支付状态; 用户支付操作 导致 订单状态为待发货状态;物流部门发货操作 导致 订单状态变为待收货状态;用户确认收货操作 导致 订单状态变为 订单完成状态。

开发任务:设计整体结算发货及收货的流程。用户创建订单 --> 支付订单 --> 发货–>收货–>订单完成。

要求:

  • 创建订单成功后,订单状态初始化为 待支付。
  • 订单状态包括: 待支付;待发货;待收货;订单完成。(状态模式)
  • 触发订单状态变化的操作:支付订单;发货;确认收货 (观察者模式)

image-20230729201538239

4.使用总结

  1. 添加枚举订单状态类,枚举操作类;
  2. 添加状态配置类,配置初始状态,配置状态扭转,配置持久化;
  3. 普通的 controller 类,普通的方法
  4. 执行支付或其他动作,发送状态消息到状态机,并持久化状态,依赖于 spring 的状态机;
  5. 状态机监听器监听到消息后,自动修改订单状态;
  6. 使用到了状态模式和观察者模式;

5.状态模式和策略模式的区别

状态模式(State Pattern)和策略模式(Strategy Pattern)是两种常见的设计模式,它们都属于行为型设计模式,但用途和实现方式有一些不同。

  1. 用途

    • 状态模式:状态模式用于在对象的状态发生改变时,将不同的行为封装到不同的状态类中,使得对象在不同状态下有不同的行为表现。这有助于将复杂的状态机行为拆分成可维护的部分,使对象的状态变化更加灵活和可扩展。例如,一个自动售货机可以具有不同的状态(例如,有货、无货、正在维护等),每个状态下的行为都不同。

    • 策略模式:策略模式用于在运行时选择算法的不同实现,将算法封装在独立的策略类中,然后在运行时选择适当的策略来执行。这有助于将算法的选择与使用代码分离,使得系统更加灵活和可维护。例如,一个排序算法可以有多种实现(快速排序、冒泡排序、插入排序等),策略模式允许在运行时选择使用哪种算法。

  2. 结构差异

    • 状态模式的关键在于对象的状态切换和状态类之间的关联。通常,状态模式会有一个上下文类,该类包含一个状态对象,状态对象实现了共同的接口,以便在不同状态下执行相关操作。状态切换通常由上下文类控制。

    • 策略模式的关键在于算法的选择和独立性。策略模式将算法封装在不同的策略类中,这些策略类通常实现相同的接口,以便可以互换使用。上下文类包含一个策略对象,可以在运行时选择不同的策略。

  3. 关注点

    • 状态模式关注对象在不同状态下的行为切换和状态管理,强调对象状态之间的转换和如何封装不同状态的行为。

    • 策略模式关注在相同的上下文下选择不同的算法或策略,强调算法的独立性和可互换性。

  4. 示例

    • 状态模式示例:自动售货机的状态可以是有货、无货、正在维护等,每个状态下执行不同的操作。

    • 策略模式示例:一个图像处理应用可以具有不同的图像滤镜策略(黑白滤镜、模糊滤镜、锐化滤镜等),用户可以在运行时选择应用哪种滤镜。

状态模式用于管理对象内部的状态转换和状态相关行为,而策略模式用于在运行时选择不同的算法或策略。这两种模式都有助于提高代码的灵活性、可维护性和可扩展性,但它们的应用场景和重点不同。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。