• 设计模式(12)状态模式


    参考【设计模式】用Java实现状态模式_java 状态模式_卷帘的博客-CSDN博客

    一、介绍:

    1、状态模式:是一种行为设计模式,它允许对象在内部状态发生改变时改变其行为。该模式将对象的行为包装在不同的状态类中,使得对象的行为可以根据其当前状态动态改变。

    2、组成:状态模式的核心思想是通过将对象的行为包装在不同的状态类中,使得对象可以根据其当前状态来改变行为,而不需要使用大量的条件判断语句。通常由以下几个角色组成:

    (1)环境类(Context):环境类是拥有状态的对象,它将会根据当前状态来执行相应的行为。它维护了一个对抽象状态类的引用,用于切换和委托不同的状态处理。

    (2)抽象状态类(State):抽象状态类定义了一个接口,用于具体状态类的实现。在该接口中声明了具体状态类需要实现的方法。

    (3)具体状态类(Concrete State):具体状态类实现了抽象状态类的接口,并负责定义该状态下的具体行为。它包含了对环境类的引用,可以根据需要切换环境类的状态。

    3、UML类图:

    4、适用场景:

    (1)当一个对象的行为取决于其内部状态,并且需要在运行时根据状态改变行为时,状态模式非常有用。它允许对象在不同状态下执行不同的操作,而不需要使用复杂的条件判断语句。

    (2)当对象具有大量的状态以及与每个状态相关的行为时,状态模式可以提供一种结构化的方式来管理和组织这些状态和行为。每个状态都可以表示为一个独立的状态类,使得代码更加清晰、可读性更高。

    (3)当需要向对象的状态变化进行动态扩展时,状态模式提供了一种灵活的解决方案。通过添加新的状态类,并相应地调整环境类与状态类之间的关联,可以轻松地增加新的状态和行为。

    (4)当多个对象需要共享同一组状态时,状态模式可以减少重复代码的编写。通过将状态封装在独立的状态类中,多个对象可以共享相同的状态实例,从而节省内存和代码维护成本。

    二、demo:

    1、电商订单状态流转:

    (1)环境类:

    1. // 环境类 - 订单
    2. class Order {
    3. private OrderState state;
    4. public Order() {
    5. state = new NewState();
    6. }
    7. public void setState(OrderState state) {
    8. this.state = state;
    9. }
    10. public void process() {
    11. state.processOrder(this);
    12. }
    13. }

    (2)抽象状态类:

    1. // 抽象状态类
    2. interface OrderState {
    3. void processOrder(Order order);
    4. }

    (3)具体状态类:

    1. // 具体状态类 - 新订单
    2. class NewState implements OrderState {
    3. public void processOrder(Order order) {
    4. System.out.println("Processing new order");
    5. // 在新订单状态下的处理逻辑
    6. // ...
    7. order.setState(new ShippedState()); // 切换状态
    8. }
    9. }
    10. // 具体状态类 - 已发货订单
    11. class ShippedState implements OrderState {
    12. public void processOrder(Order order) {
    13. System.out.println("Processing shipped order");
    14. // 在已发货订单状态下的处理逻辑
    15. // ...
    16. order.setState(new DeliveredState()); // 切换状态
    17. }
    18. }
    19. // 具体状态类 - 已交付订单
    20. class DeliveredState implements OrderState {
    21. public void processOrder(Order order) {
    22. System.out.println("Processing delivered order");
    23. // 在已交付订单状态下的处理逻辑
    24. // ...
    25. }
    26. }

    (4)使用示例

    1. public class Main {
    2. public static void main(String[] args) {
    3. Order order = new Order();
    4. order.process(); // 处理新订单
    5. order.process(); // 处理已发货订单
    6. order.process(); // 处理已交付订单
    7. }
    8. }


     

  • 相关阅读:
    电源硬件设计----升压(Boost)变换器基础
    CSAPP 之 CacheLab 详解
    [尚硅谷React笔记]——第4章 React ajax
    【树莓派 Pico 基于MicroPython编程Thonny开发】
    【Java成王之路】EE初阶第十八篇: 前端三剑客 HTML基础篇
    基于springboot+vue实现MOBA类游戏攻略平台项目【项目源码+论文说明】
    1999-2018年地级市经济增长数据
    STM32使用串口空闲中断(IDLE)和 DMA接收一串数据流
    电镀含镍废水如何回收镍?电镀废水除镍的工艺方法有哪些?
    1-深度学习绪论讲解
  • 原文地址:https://blog.csdn.net/w_t_y_y/article/details/134004795