浅析Java设计模式【3.7】——状态

简介: Java常用设计模式,状态模式

1. 概念

软件开发领域,应用程序中的部分对象可能会根据不同的情况做出不同的行为,把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态就会发生改变,从而使其行为也发生改变。

对这种有状态的对象编程,传统的解决方案是:将这些所有可能发生的情况全都考虑到,然后使用 if-elseswitch-case 语句来做状态判断,再进行不同情况的处理。但是显然这种做法对复杂的状态判断存在天然弊端,条件判断语句会过于臃肿,可读性差,且不具备扩展性,维护难度也大。且增加新的状态时要添加新的 if-else 语句,这违背了 开闭原则 ,不利于程序的扩展。

以上问题如果采用 状态模式 就能很好地得到解决。

2. 适用场景

当定义或者声明实例状态转换的条件过于复杂时,把状态的转换逻辑移到表示不同状态的一系列类中,目的是为了简化逻辑。

消除了 if-elseswitch-case 等冗余语句,代码更有层次性,并且具备良好的扩展力。

用电商中的订单来举例,订单状态每次发⽣变更,都要执⾏不同的操作。

  • 订单完成⽀付:

    • ⽴即通知商家发货,
    • 减库存
    • 生成积分
  • 订单执⾏取消:

    • 执⾏库存回滚,
    • 执⾏退款操作
    • 积分账户扣减
    • 如果订单已⽀付,还需要执⾏退款操作,⽆论是通知商

3. 优缺点

3.1. 优点

  • 封装了转换规则。
  • 将所有与某个状态有关的⾏为放到⼀个类中,并且可以⽅便地增加新的状态,只需要改变对象状态即可改变对象的⾏为。
  • 允许状态转换逻辑与状态对象合成⼀体,⽽不是某⼀个巨⼤的条件语句块。

3.2. 缺点

  • 状态模式的使⽤必然会增加系统类和对象的个数。
  • 状态模式对 开闭原则 的⽀持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则⽆法切换到新增状态,⽽且修改某个状态类的⾏为也需修改对应类的源代码。

4. 样例

4.1. 状态


public interface State {

    /** 变更状态
     * @author <a href="https://github.com/rothschil">Sam</a>
     * @date 2022/8/5-14:09
     * @param order
     **/
    void doAction(Order order);

    /** 执⾏⾏为
     * @author <a href="https://github.com/rothschil">Sam</a>
     * @date 2022/8/5-14:09
     **/
    void execute();

}

4.2. 订单支付


@Slf4j
public class PaymentConfirmNoticeBehavior implements State{

    @Override
    public void doAction(Order order) {
        log.warn("订单支付");
        order.setState(this);
    }

    @Override
    public void execute() {
        log.warn("通知商家发货");
        log.warn("通知减库存");
        log.warn("通知积分新增");
    }
}

4.3. 订单取消


@Slf4j
public class PaymentCancelNoticeBehavior implements State{

    @Override
    public void doAction(Order order) {
        log.warn("订单取消支付");
        order.setState(this);
    }

    @Override
    public void execute() {
        log.warn("订单取消,执行库存回滚");
        log.warn("订单取消,执行退款");
        log.warn("订单取消,回退积分收益");
    }
}

4.4. 客户端


    @DisplayName("状态模式")
    @Test
    public void testState() {
        OrderService orderService = new OrderService();
        Order order =orderService.find(2021L);

        PaymentConfirmNoticeBehavior behavior = new PaymentConfirmNoticeBehavior();
        behavior.doAction(order);
        order.getState().execute();
    }

4.5. 效果


2022-08-05 16:55:53,131 WARN (PaymentConfirmNoticeBehavior.java:11)- 订单支付
2022-08-05 16:55:53,134 WARN (PaymentConfirmNoticeBehavior.java:17)- 通知商家发货
2022-08-05 16:55:53,135 WARN (PaymentConfirmNoticeBehavior.java:18)- 通知减库存
2022-08-05 16:55:53,135 WARN (PaymentConfirmNoticeBehavior.java:19)- 通知积分新增
目录
相关文章
|
3月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
3月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
56 4
|
4月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
92 0
[Java]23种设计模式
|
3月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
114 0
|
4月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
5月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
5月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
5月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
5月前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
5月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)

热门文章

最新文章