设计模式——状态模式

状态模式 (State Pattern)

什么是状态模式?

状态模式是一种行为型设计模式,它允许你在对象的内部状态改变时改变它的行为。对象看起来好像改变了它的类。

简单来说:状态模式就是让对象在不同状态下有不同的行为。

生活中的例子

想象一下:

  • 订单状态:待支付、已支付、已发货、已完成
  • 交通灯:红灯、黄灯、绿灯
  • 游戏角色:正常、受伤、死亡

为什么需要状态模式?

传统方式的问题

java 复制代码
// 使用if-else处理状态
if (state == "待支付") {
    // 待支付逻辑
} else if (state == "已支付") {
    // 已支付逻辑
} else if (state == "已发货") {
    // 已发货逻辑
}

问题

  1. 代码臃肿:大量if-else导致代码臃肿
  2. 难以扩展:新增状态需要修改代码
  3. 难以维护:状态逻辑分散在代码各处

状态模式的优势

java 复制代码
// 使用状态模式
state.handle();

优势

  1. 清晰分离:每个状态的行为清晰分离
  2. 易于扩展:新增状态很容易
  3. 易于维护:状态逻辑集中管理

状态模式的结构

复制代码
┌─────────────────────┐
│      State          │  状态接口
├─────────────────────┤
│ + handle(): void    │
└──────────┬──────────┘
           │ 实现
           ├──┬──────────────────┬──────────────┐
           │                    │              │
┌──────────┴──────┐  ┌───────────┴───────┐  ┌───┴────────┐
│ ConcreteState1   │  │ ConcreteState2    │  │ ...       │  具体状态
├─────────────────┤  ├───────────────────┤  ├────────────┤
│ + handle()      │  │ + handle()        │  │            │
└─────────────────┘  └───────────────────┘  └────────────┘

┌─────────────────────┐
│     Context         │  上下文
├─────────────────────┤
│ - state: State      │
│ + setState(): void  │
│ + request(): void   │
└─────────────────────┘

代码示例

1. 定义状态接口

java 复制代码
/**
 * 状态接口
 */
public interface State {
    /**
     * 处理请求
     */
    void handle();
}

2. 定义具体状态

java 复制代码
/**
 * 具体状态:待支付状态
 */
public class PendingPaymentState implements State {
    @Override
    public void handle() {
        System.out.println("订单状态:待支付,等待用户支付");
    }
}

/**
 * 具体状态:已支付状态
 */
public class PaidState implements State {
    @Override
    public void handle() {
        System.out.println("订单状态:已支付,等待发货");
    }
}

/**
 * 具体状态:已发货状态
 */
public class ShippedState implements State {
    @Override
    public void handle() {
        System.out.println("订单状态:已发货,等待收货");
    }
}

/**
 * 具体状态:已完成状态
 */
public class CompletedState implements State {
    @Override
    public void handle() {
        System.out.println("订单状态:已完成");
    }
}

3. 定义上下文

java 复制代码
/**
 * 上下文:订单
 */
public class Order {
    private State state;
    
    public Order() {
        this.state = new PendingPaymentState();
    }
    
    public void setState(State state) {
        this.state = state;
    }
    
    public void request() {
        state.handle();
    }
}

4. 使用状态

java 复制代码
/**
 * 状态模式测试类
 * 演示如何使用状态模式管理订单状态
 */
public class StateTest {
    
    public static void main(String[] args) {
        System.out.println("=== 状态模式测试 ===\n");
        
        // 创建订单
        Order order = new Order();
        
        // 测试不同状态
        System.out.println("--- 待支付状态 ---");
        order.request();
        
        System.out.println("\n--- 已支付状态 ---");
        order.setState(new PaidState());
        order.request();
        
        System.out.println("\n--- 已发货状态 ---");
        order.setState(new ShippedState());
        order.request();
        
        System.out.println("\n--- 已完成状态 ---");
        order.setState(new CompletedState());
        order.request();
        
        System.out.println("\n=== 状态模式的优势 ===");
        System.out.println("1. 清晰分离:每个状态的行为清晰分离");
        System.out.println("2. 易于扩展:新增状态很容易");
        System.out.println("3. 易于维护:状态逻辑集中管理");
        System.out.println("4. 避免条件语句:避免大量if-else");
        
        System.out.println("\n=== 实际应用场景 ===");
        System.out.println("1. 订单系统:订单状态管理");
        System.out.println("2. 游戏开发:角色状态管理");
        System.out.println("3. 工作流:工作流状态管理");
        System.out.println("4. 交通灯:交通灯状态管理");
        
        System.out.println("\n=== 与策略模式的区别 ===");
        System.out.println("状态模式:对象在不同状态下有不同的行为");
        System.out.println("策略模式:对象在不同策略下有不同的行为");
        System.out.println("状态模式:状态之间有转换关系");
        System.out.println("策略模式:策略之间没有转换关系");
    }
}

状态模式的优点

  1. 清晰分离:每个状态的行为清晰分离
  2. 易于扩展:新增状态很容易
  3. 易于维护:状态逻辑集中管理
  4. 避免条件语句:避免大量if-else

状态模式的缺点

  1. 类数量增加:每个状态都需要一个类
  2. 状态转换复杂:状态转换可能比较复杂

适用场景

  1. 多个状态:对象有多个状态
  2. 状态依赖:行为依赖于状态
  3. 状态转换:状态需要频繁转换

常见应用场景

  • 订单系统:订单状态管理
  • 游戏开发:角色状态管理
  • 工作流:工作流状态管理

使用建议

  • 多个状态:使用状态模式
  • 状态依赖:使用状态模式
  • 简单状态:直接使用if-else即可

注意事项

⚠️ 状态模式虽然有用,但要注意:

  • 不要让状态转换过于复杂
  • 考虑使用状态机
相关推荐
I'm Jie12 小时前
Swagger UI 本地化部署,解决 FastAPI Swagger UI 依赖外部 CDN 加载失败问题
python·ui·fastapi·swagger·swagger ui
爱学习的程序媛13 小时前
【Web前端】优化Core Web Vitals提升用户体验
前端·ui·web·ux·用户体验
爱学习的程序媛13 小时前
【Web前端】前端用户体验优化全攻略
前端·ui·交互·web·ux·用户体验
紫丁香13 小时前
Selenium自动化测试详解1
python·selenium·测试工具·ui
GISer_Jing14 小时前
前端组件库——shadcn/ui:轻量、自由、可拥有,解锁前端组件库的AI时代未来
前端·人工智能·ui
阿珊和她的猫16 小时前
微信小程序静默授权异步问题的处理方案
微信小程序·状态模式·notepad++
rjc_lihui17 小时前
IntelliSense: 无法打开 源 文件 “ui_mainwindow.h“ demo\qtdemosrc\mainwindow
ui
前端不太难1 天前
ArkUI 的页面生命周期详解
状态模式
老星*1 天前
Lucide Icons:开源、轻量、设计师友好的现代图标库
ui·开源·github
Swift社区1 天前
AI 驱动 UI:鸿蒙 ArkUI 的新可能
人工智能·ui·harmonyos