状态模式(State Pattern)

状态模式(State Pattern) 是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。该模式将每个状态封装成独立的类,使得对象看起来像是"改变了它的类"。

💡 核心思想:把条件判断逻辑转化为对象之间的委托与切换

java 复制代码
/**
 * 订单状态接口 - 状态模式核心
 * 每个具体状态实现此接口以定义该状态下的行为
 */
public interface OrderState {
    void pay(OrderContext context);
    void ship(OrderContext context);
    void deliver(OrderContext context);
    void complete(OrderContext context);
    void cancel(OrderContext context);
}
java 复制代码
/**
 * 待支付状态
 */
public class PendingState implements OrderState {
    @Override
    public void pay(OrderContext context) {
        System.out.println("订单支付成功");
        context.setState(context.getPaidState());
    }

    @Override
    public void ship(OrderContext context) {
        throw new IllegalStateException("订单未支付,无法发货");
    }

    @Override
    public void deliver(OrderContext context) {
        throw new IllegalStateException("订单未发货,无法送达");
    }

    @Override
    public void complete(OrderContext context) {
        throw new IllegalStateException("订单未送达,无法完成");
    }

    @Override
    public void cancel(OrderContext context) {
        System.out.println("订单已取消");
        context.setState(context.getCancelledState());
    }
}
java 复制代码
/**
 * 已支付状态
 */
public class PaidState implements OrderState {
    @Override
    public void pay(OrderContext context) {
        throw new IllegalStateException("订单已支付,无需重复支付");
    }

    @Override
    public void ship(OrderContext context) {
        System.out.println("订单已发货");
        context.setState(context.getShippedState());
    }

    @Override
    public void deliver(OrderContext context) {
        throw new IllegalStateException("订单未发货,无法送达");
    }

    @Override
    public void complete(OrderContext context) {
        throw new IllegalStateException("订单未送达,无法完成");
    }

    @Override
    public void cancel(OrderContext context) {
        System.out.println("订单已取消,退款处理中");
        context.setState(context.getCancelledState());
    }
}
java 复制代码
/**
 * 已发货状态
 */
public class ShippedState implements OrderState {
    @Override
    public void pay(OrderContext context) {
        throw new IllegalStateException("订单已支付,无法再次支付");
    }

    @Override
    public void ship(OrderContext context) {
        throw new IllegalStateException("订单已发货,无需重复发货");
    }

    @Override
    public void deliver(OrderContext context) {
        System.out.println("订单已送达");
        context.setState(context.getDeliveredState());
    }

    @Override
    public void complete(OrderContext context) {
        throw new IllegalStateException("订单未送达,无法完成");
    }

    @Override
    public void cancel(OrderContext context) {
        throw new IllegalStateException("订单已发出,无法取消");
    }
}
java 复制代码
/**
 * 已送达状态
 */
public class DeliveredState implements OrderState {
    @Override
    public void pay(OrderContext context) {
        throw new IllegalStateException("订单已支付,无法再次支付");
    }

    @Override
    public void ship(OrderContext context) {
        throw new IllegalStateException("订单已发货,无需重复发货");
    }

    @Override
    public void deliver(OrderContext context) {
        throw new IllegalStateException("订单已送达,无需重复送达");
    }

    @Override
    public void complete(OrderContext context) {
        System.out.println("订单已完成");
        context.setState(context.getCompletedState());
    }

    @Override
    public void cancel(OrderContext context) {
        throw new IllegalStateException("订单已完成,无法取消");
    }
}
java 复制代码
/**
 * 已完成状态
 */
public class CompletedState implements OrderState {
    @Override
    public void pay(OrderContext context) {
        throw new IllegalStateException("订单已完成,无法支付");
    }

    @Override
    public void ship(OrderContext context) {
        throw new IllegalStateException("订单已完成,无法发货");
    }

    @Override
    public void deliver(OrderContext context) {
        throw new IllegalStateException("订单已完成,无法送达");
    }

    @Override
    public void complete(OrderContext context) {
        throw new IllegalStateException("订单已完成,无需重复完成");
    }

    @Override
    public void cancel(OrderContext context) {
        throw new IllegalStateException("订单已完成,无法取消");
    }
}
java 复制代码
/**
 * 已取消状态
 */
public class CancelledState implements OrderState {
    @Override
    public void pay(OrderContext context) {
        throw new IllegalStateException("订单已取消,无法支付");
    }

    @Override
    public void ship(OrderContext context) {
        throw new IllegalStateException("订单已取消,无法发货");
    }

    @Override
    public void deliver(OrderContext context) {
        throw new IllegalStateException("订单已取消,无法送达");
    }

    @Override
    public void complete(OrderContext context) {
        throw new IllegalStateException("订单已取消,无法完成");
    }

    @Override
    public void cancel(OrderContext context) {
        throw new IllegalStateException("订单已取消,无需重复取消");
    }
}
java 复制代码
/**
 * 订单上下文类,持有当前状态并委托行为到状态实现
 */
public class OrderContext {
    private OrderState currentState;
    private final PendingState pendingState = new PendingState();
    private final PaidState paidState = new PaidState();
    private final ShippedState shippedState = new ShippedState();
    private final DeliveredState deliveredState = new DeliveredState();
    private final CompletedState completedState = new CompletedState();
    private final CancelledState cancelledState = new CancelledState();
    private String orderId;

    public OrderContext(String orderId) {
        this.orderId = orderId;
        this.currentState = pendingState;
    }

    public OrderState getCurrentState() {
        return currentState;
    }

    public void setState(OrderState state) {
        System.out.println("订单 " + orderId + " 状态变更: " + this.currentState.getClass().getSimpleName() + " -> " + state.getClass().getSimpleName());
        this.currentState = state;
    }

    // Getter methods for state instances
    public PendingState getPendingState() {
        return pendingState;
    }

    public PaidState getPaidState() {
        return paidState;
    }

    public ShippedState getShippedState() {
        return shippedState;
    }

    public DeliveredState getDeliveredState() {
        return deliveredState;
    }

    public CompletedState getCompletedState() {
        return completedState;
    }

    public CancelledState getCancelledState() {
        return cancelledState;
    }

    // Delegated behavior methods
    public void pay() {
        currentState.pay(this);
    }

    public void ship() {
        currentState.ship(this);
    }

    public void deliver() {
        currentState.deliver(this);
    }

    public void complete() {
        currentState.complete(this);
    }

    public void cancel() {
        currentState.cancel(this);
    }
}
java 复制代码
/**
 * 状态模式示例:订单状态机
 * 演示如何使用状态模式管理订单生命周期
 */
public class OrderStatePatternExample {
    
    public static void main(String[] args) {
        System.out.println("=== 订单状态模式演示 ===");
        
        // 创建订单
        OrderContext order = new OrderContext("ORD-20230001");
        System.out.println("初始状态: " + order.getCurrentState().getClass().getSimpleName());

        try {
            // 正常流程:待支付 -> 已支付 -> 已发货 -> 已送达 -> 已完成
            System.out.println("\n--- 正常订单流程 ---");
            order.pay();
            order.ship();
            order.deliver();
            order.complete();

            // 尝试非法操作
            System.out.println("\n--- 测试非法操作 ---");
            System.out.println("尝试再次支付...");
            order.pay(); // 应该抛出异常

        } catch (IllegalStateException e) {
            System.out.println("拦截非法操作: " + e.getMessage());
        }

        // 创建新订单测试取消流程
        System.out.println("\n--- 取消订单流程 ---");
        OrderContext cancelOrder = new OrderContext("ORD-20230002");
        System.out.println("初始状态: " + cancelOrder.getCurrentState().getClass().getSimpleName());
        cancelOrder.cancel();
        System.out.println("最终状态: " + cancelOrder.getCurrentState().getClass().getSimpleName());
        
        try {
            System.out.println("尝试支付已取消订单...");
            cancelOrder.pay(); // 应该抛出异常
        } catch (IllegalStateException e) {
            System.out.println("拦截非法操作: " + e.getMessage());
        }
        
        System.out.println("\n=== 演示结束 ===");
    }
}
相关推荐
Yu_Lijing5 小时前
基于C++的《Head First设计模式》笔记——备忘录模式
c++·笔记·设计模式·备忘录模式
无籽西瓜a7 小时前
【西瓜带你学设计模式 | 第二期-观察者模式】观察者模式——推模型与拉模型实现、优缺点与适用场景
java·后端·观察者模式·设计模式
我真会写代码10 小时前
Java程序员常用设计模式详解(实战版)
java·开发语言·设计模式
无籽西瓜a12 小时前
【西瓜带你学设计模式 | 第一期-单例模式】单例模式——定义、实现方式、优缺点与适用场景以及注意事项
java·后端·单例模式·设计模式
cliffordl21 小时前
设计模式(python)
python·设计模式
云道轩1 天前
告诉 Claude Code 在项目中遵循特定的编程模式/设计模式和技术栈约束
设计模式·ai·agent·claude code
花间相见1 天前
【Java基础面试题】—— 核心知识点面试题(含答案):语法+集合+JVM+设计模式+算法
java·jvm·设计模式
朱一头zcy1 天前
设计模式入门:最简单的模板方法模式
笔记·设计模式·模板方法模式
君主黑暗1 天前
设计模式-观察者模式
观察者模式·设计模式
砍光二叉树1 天前
【设计模式】结构型-组合模式
设计模式·组合模式