设计模式-06
六.订单状态模块
1.状态模式
-
State——抽象状态角色(Enum 完成) 接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。
-
ConcreteState——具体状态角色 (状态变化 Enum) 每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,通俗地说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。
-
Context——环境角色 (用户触发 – 》 controller + service) 定义客户端需要的接口,并且负责具体状态的切换。
2.观察者模式
观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe)
-
Subject 被观察者 定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。
-
ConcreteSubject 具体的被观察者 定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。
-
Observer 观察者 观察者接收到消息后,即进行 update(更新方法)操作,对接收到的信息进行处理。
-
ConcreteObserver 具体的观察者
s 是状态,e 是操作类型
public class StateMachineConfigurerAdapter<S, E> extends AbstractStateMachineConfigurerAdapter<S, E> {
public StateMachineConfigurerAdapter() {
}
}
3.状态模式 + 观察者模式(监听器模式)
模式作用:
- 状态模式:状态动态变更;
- 观察者模式:观察状态变更,并出发相应
项目需求概述:
用户从开始下订单,到支付完成,再到物流部进行发货,最终用户确认收货,整个流程涉及到很多订单状态,需要通过代码对订单状态进行管理。除此之外,用户或者物流部门每一次触发的不同操作都有可能改变订单状态。
如:用户创建订单操作 导致 订单状态为 待支付状态; 用户支付操作 导致 订单状态为待发货状态;物流部门发货操作 导致 订单状态变为待收货状态;用户确认收货操作 导致 订单状态变为 订单完成状态。
开发任务:
设计整体结算发货及收货的流程。用户创建订单 --> 支付订单 --> 发货–>收货–>订单完成。
要求:
- 创建订单成功后,订单状态初始化为 待支付。
- 订单状态包括: 待支付;待发货;待收货;订单完成。(状态模式)
- 触发订单状态变化的操作:支付订单;发货;确认收货 (观察者模式)
4.使用总结
- 添加枚举订单状态类,枚举操作类;
- 添加状态配置类,配置初始状态,配置状态扭转,配置持久化;
- 普通的 controller 类,普通的方法
- 执行支付或其他动作,发送状态消息到状态机,并持久化状态,依赖于 spring 的状态机;
- 状态机监听器监听到消息后,自动修改订单状态;
- 使用到了状态模式和观察者模式;
5.状态模式和策略模式的区别
状态模式(State Pattern)和策略模式(Strategy Pattern)是两种常见的设计模式,它们都属于行为型设计模式,但用途和实现方式有一些不同。
-
用途:
-
状态模式:状态模式用于在对象的状态发生改变时,将不同的行为封装到不同的状态类中,使得对象在不同状态下有不同的行为表现。这有助于将复杂的状态机行为拆分成可维护的部分,使对象的状态变化更加灵活和可扩展。例如,一个自动售货机可以具有不同的状态(例如,有货、无货、正在维护等),每个状态下的行为都不同。
-
策略模式:策略模式用于在运行时选择算法的不同实现,将算法封装在独立的策略类中,然后在运行时选择适当的策略来执行。这有助于将算法的选择与使用代码分离,使得系统更加灵活和可维护。例如,一个排序算法可以有多种实现(快速排序、冒泡排序、插入排序等),策略模式允许在运行时选择使用哪种算法。
-
-
结构差异:
-
状态模式的关键在于对象的状态切换和状态类之间的关联。通常,状态模式会有一个上下文类,该类包含一个状态对象,状态对象实现了共同的接口,以便在不同状态下执行相关操作。状态切换通常由上下文类控制。
-
策略模式的关键在于算法的选择和独立性。策略模式将算法封装在不同的策略类中,这些策略类通常实现相同的接口,以便可以互换使用。上下文类包含一个策略对象,可以在运行时选择不同的策略。
-
-
关注点:
-
状态模式关注对象在不同状态下的行为切换和状态管理,强调对象状态之间的转换和如何封装不同状态的行为。
-
策略模式关注在相同的上下文下选择不同的算法或策略,强调算法的独立性和可互换性。
-
-
示例:
-
状态模式示例:自动售货机的状态可以是有货、无货、正在维护等,每个状态下执行不同的操作。
-
策略模式示例:一个图像处理应用可以具有不同的图像滤镜策略(黑白滤镜、模糊滤镜、锐化滤镜等),用户可以在运行时选择应用哪种滤镜。
-
状态模式用于管理对象内部的状态转换和状态相关行为,而策略模式用于在运行时选择不同的算法或策略。这两种模式都有助于提高代码的灵活性、可维护性和可扩展性,但它们的应用场景和重点不同。
- 点赞
- 收藏
- 关注作者
评论(0)