Java设计模式——状态模式

⚪状态模式(State)是一种行为型设计模式,状态模式将对象的不同状态封装成独立的类,使得状态之间的转换更加清晰和可维护。

⚪意图:它允许对象在其内部状态发生变化时改变其行为。

⚪以下是工厂方法模式的关键要点:

        ▷ 角色和责任

  1. Context(上下文):Context 是拥有状态的对象,它维护一个对当前状态对象的引用,并在状态发生变化时委托给状态对象处理。Context 提供了一个接口供客户端请求状态变化,并在适当的时候将请求委托给当前状态对象。
  2. State(状态):State 是一个接口或抽象类,定义了具体状态类的方法。这些方法通常包括在不同状态下可以执行的操作。每个具体状态类都实现了 State 接口或继承了 State 抽象类,并实现了这些方法。
  3. ConcreteState(具体状态):ConcreteState 是具体的状态类,它实现了 State 接口或继承了 State 抽象类。每个具体状态类负责处理特定状态下的操作,并在需要时转换到其他状态。

        ▷ 工作流程

  1. 定义状态类:首先,定义所有可能的状态,并为每个状态创建一个具体状态类,这些类实现了 State 接口或继承了 State 抽象类。
  2. 创建上下文类:创建上下文类(Context),它包含一个对当前状态对象的引用,并提供一个接口供客户端请求状态变化。
  3. 实现状态转换方法:在上下文类中实现方法,用于在不同状态之间进行转换。通常,这些方法会修改当前状态对象的引用。
  4. 客户端操作:客户端通过上下文类的接口请求状态变化,上下文类会将请求委托给当前状态对象处理。

        ▷ 示例

// 1. 定义状态接口
interface State {
    void doAction(Context context);
}

// 2. 创建具体状态类
class EditState implements State {
    public void doAction(Context context) {
        System.out.println("Editor is in edit mode");
        context.setState(this);
    }
}

class SaveState implements State {
    public void doAction(Context context) {
        System.out.println("Document is saved");
        context.setState(this);
    }
}

class PrintState implements State {
    public void doAction(Context context) {
        System.out.println("Document is printed");
        context.setState(this);
    }
}

// 3. 创建上下文类
class Context {
    private State currentState;

    public Context() {
        currentState = null;
    }

    public void setState(State state) {
        currentState = state;
    }

    public State getState() {
        return currentState;
    }
}

public class StateDemo{
    public static void main(String[] args) {
        Context context = new Context();

        EditState editState = new EditState();
        editState.doAction(context);

        System.out.println("Current state: " + context.getState().getClass().getSimpleName());

        SaveState saveState = new SaveState();
        saveState.doAction(context);

        System.out.println("Current state: " + context.getState().getClass().getSimpleName());

        PrintState printState = new PrintState();
        printState.doAction(context);

        System.out.println("Current state: " + context.getState().getClass().getSimpleName());
    }
}

⚪适用性

  1. 一个对象的行为决定于它的状态,并且它必须在运行时刻根据状态改变它的行为。
  2. 一个操作中含有庞大的多分文的条件语句,且这些分支依赖于该对象的状态。这个状态常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得开发者可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象独立变化。

⚪应用场景

  1. 对象的行为依赖于其状态,并且在运行时可能会发生状态变化。 当一个对象需要根据其内部状态来改变行为时,状态模式是一个非常合适的选择。这可以帮助我们消除大量的条件语句,使代码更加清晰和可维护。
  2. 对象具有多个状态,且状态之间需要频繁切换。 如果一个对象有多个状态,并且在不同的状态下执行不同的操作,状态模式可以帮助我们组织和管理这些状态及其转换。
  3. 避免在上下文类中堆积大量的条件分支。 如果在上下文类中存在大量的条件分支,状态模式可以将状态相关的代码分散到各个状态类中,从而减少上下文类的复杂性。

⚪实际已有场景

  1. Spring框架中的Bean生命周期: 在Spring框架中,每个Bean都有一个生命周期,它可以处于不同的状态,如初始化、销毁等。Spring使用状态模式来管理Bean的生命周期,允许用户根据需要定义自定义的初始化和销毁行为。
  2. 订单状态管理: 在电子商务应用中,订单通常具有多个状态,如待支付、已支付、已发货等。状态模式可以用于管理订单的不同状态以及在状态转换时执行相应的操作。
  3. 工作流引擎: 工作流引擎通常需要管理工作流程中的不同状态和状态之间的转换。状态模式可以用于定义和管理工作流中的状态和状态转换规则。

 

posted @ 2023-10-04 13:45  xiaogh  阅读(105)  评论(0)    收藏  举报