设计模式——状态模式

状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为。该模式通过将不同状态下的行为封装到不同的具体状态类中,使得一个对象在其内部状态改变时可以改变它的行为。

原理

  • 环境角色(Context): 它定义了客户端需要的接口,并且维护了一个当前状态实例。这个环境类也可以包含一些与所有状态相关的行为。
  • 抽象状态角色(State): 定义了一个接口以封装与特定上下文相关的行为。通常会有一个或多个方法来处理来自环境角色的消息,同时可以定义一个方法用于改变上下文的状态。
  • 具体状态角色(Concrete State): 每个具体状态类都实现了抽象状态角色定义的接口,每个类对应一种具体的上下文状态,并负责在相应状态下处理请求。

Java代码示例

// 抽象状态角色
public abstract class OrderState {
   
    protected Order order;

    public void setOrder(Order order) {
   
        this.order = order;
    }

    // 抽象方法,由具体状态实现
    public abstract void process();
}

// 具体状态角色 - 待支付状态
public class UnpaidState extends OrderState {
   
    @Override
    public void process() {
   
        System.out.println("Processing unpaid state, sending payment request...");
        // 更改状态至已支付状态
        order.setState(new PaidState());
    }
}

// 具体状态角色 - 已支付状态
public class PaidState extends OrderState {
   
    @Override
    public void process() {
   
        System.out.println("Processing paid state, preparing for shipping...");
        // 更改状态至待发货状态
        order.setState(new ShippedState());
    }
}

// 省略其他具体状态...

// 环境角色 - 订单
public class Order {
   
    private OrderState state;

    public void setState(OrderState state) {
   
        state.setOrder(this);
        this.state = state;
    }

    public void processOrder() {
   
        state.process();
    }
}

// 使用示例
public class Client {
   
    public static void main(String[] args) {
   
        Order order = new Order();
        order.setState(new UnpaidState());  // 设置初始状态为待支付
        order.processOrder();  // 处理订单,状态变化并触发相应操作
    }
}

想象一下你正在经营一家网店,客户下单后,订单的状态会从“待支付”变成“已支付”,然后变成“待发货”等等。状态模式就是将这些不同的阶段分别封装成不同的状态类,在每个阶段下订单有不同的处理逻辑。例如,当订单处于“待支付”状态时,系统会尝试进行收款;而在“已支付”状态下,则开始准备商品打包发货。

应用场景

  • 订单流程:订单可能有多种状态(如待支付、已支付、待发货、已发货等),每种状态下订单的行为和可执行的操作都不同。
  • 游戏人物状态切换:游戏角色可能有不同的战斗状态(普通攻击、防御、冲刺等),每种状态下的动作和响应都不一样。

适用性

  • 对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变其行为。
  • 需要避免使用大量的条件语句(if-else 或 switch-case)来决定对象的行为。
  • 一个对象在其生命周期内可能会经历一系列的状态转换,而这些状态之间的转换规则相对复杂。

相关推荐

  1. 设计模式状态模式

    2024-01-18 18:46:02       58 阅读
  2. 设计模式——状态模式

    2024-01-18 18:46:02       54 阅读
  3. 设计模式-状态模式

    2024-01-18 18:46:02       50 阅读
  4. 设计模式-状态模式

    2024-01-18 18:46:02       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-18 18:46:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-18 18:46:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-18 18:46:02       82 阅读
  4. Python语言-面向对象

    2024-01-18 18:46:02       91 阅读

热门阅读

  1. 揭秘返利机器人的工作原理与实现思路

    2024-01-18 18:46:02       59 阅读
  2. 【C/C++】C语言的高级编程(内存分区,指针)

    2024-01-18 18:46:02       55 阅读
  3. springboot中不同url怎么访问同一个方法

    2024-01-18 18:46:02       58 阅读
  4. 基于TF-IDF的关键词提取的实现

    2024-01-18 18:46:02       39 阅读
  5. 运用虚拟空间建造网站的缺点

    2024-01-18 18:46:02       52 阅读
  6. vue3基础: 组件注册

    2024-01-18 18:46:02       55 阅读
  7. 数据库Mysql学习day01课堂笔记

    2024-01-18 18:46:02       52 阅读
  8. 60.Spring事务实现基本原理

    2024-01-18 18:46:02       51 阅读
  9. 设计模式之多线程分工模式--- Thread-Per-Message模式

    2024-01-18 18:46:02       54 阅读
  10. 设计模式之多线程分工模式---Worker Thread模式

    2024-01-18 18:46:02       65 阅读
  11. Template -- React

    2024-01-18 18:46:02       56 阅读