浅析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();

}
AI 代码解读

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("通知积分新增");
    }
}
AI 代码解读

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("订单取消,回退积分收益");
    }
}
AI 代码解读

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();
    }
AI 代码解读

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)- 通知积分新增
AI 代码解读
目录
相关文章
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
66 0
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
134 6
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
109 4
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
297 0
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
111 2
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问