跳转到内容

Java状态模式

来自代码酷

Java状态模式[编辑 | 编辑源代码]

状态模式(State Pattern)是行为型设计模式的一种,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。状态模式将状态相关的行为封装到独立的状态类中,并通过上下文类(Context)委托给当前状态对象处理请求,从而消除庞大的条件分支语句,提高代码的可维护性和扩展性。

核心概念[编辑 | 编辑源代码]

状态模式包含以下主要角色:

  • Context(上下文):定义客户端接口,维护一个当前状态对象的引用。
  • State(状态接口):声明状态相关的方法,通常对应上下文中的行为。
  • ConcreteState(具体状态):实现状态接口,定义特定状态下的行为。

classDiagram class Context { -state: State +request() +setState(State) } interface State { <<interface>> +handle() } class ConcreteStateA { +handle() } class ConcreteStateB { +handle() } Context --> State State <|-- ConcreteStateA State <|-- ConcreteStateB

代码示例[编辑 | 编辑源代码]

以下是一个简单的电视遥控器示例,展示状态模式如何管理电视的开关状态:

// 状态接口
interface TVState {
    void pressPowerButton(TVContext context);
}

// 具体状态:开机状态
class TVOnState implements TVState {
    @Override
    public void pressPowerButton(TVContext context) {
        System.out.println("TV is turning OFF.");
        context.setState(new TVOffState());
    }
}

// 具体状态:关机状态
class TVOffState implements TVState {
    @Override
    public void pressPowerButton(TVContext context) {
        System.out.println("TV is turning ON.");
        context.setState(new TVOnState());
    }
}

// 上下文类
class TVContext {
    private TVState currentState;

    public TVContext() {
        this.currentState = new TVOffState(); // 初始状态
    }

    public void setState(TVState state) {
        this.currentState = state;
    }

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

// 客户端代码
public class StatePatternDemo {
    public static void main(String[] args) {
        TVContext tv = new TVContext();
        
        tv.pressPowerButton(); // 输出: TV is turning ON.
        tv.pressPowerButton(); // 输出: TV is turning OFF.
    }
}

输出结果:

TV is turning ON.
TV is turning OFF.

实际应用场景[编辑 | 编辑源代码]

状态模式在以下场景中特别有用: 1. 订单状态管理:如电商系统中订单的"待支付"、"已发货"、"已完成"等状态转换。 2. 游戏角色状态:如角色的"站立"、"奔跑"、"跳跃"等行为切换。 3. 工作流引擎:如文档审批流程中的"草稿"、"审核中"、"已发布"状态。

数学表示[编辑 | 编辑源代码]

状态转换可以形式化为: sn+1=f(sn,e) 其中:

  • sn 是当前状态
  • e 是触发事件
  • f 是状态转换函数

优缺点[编辑 | 编辑源代码]

优点:

  • 将状态相关的行为局部化,减少条件语句
  • 使状态转换显式化
  • 易于添加新状态

缺点:

  • 可能导致过多的状态类
  • 上下文类需要暴露状态设置方法,可能破坏封装

扩展阅读[编辑 | 编辑源代码]

状态模式与策略模式结构相似,但目的不同:

  • 状态模式:状态改变是自发的,状态之间知道彼此
  • 策略模式:策略选择由客户端主动控制,策略之间独立

通过掌握状态模式,开发者可以更优雅地处理复杂的状态逻辑,使系统更易于维护和扩展。