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

结构

  • 上下文(Context): 定义了客户端感兴趣的接口,并维护一个具体状态类的实例,该实例定义当前的状态。
public class Context {
    private State state;

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

    public void request() {
        state.handleRequest();
    }
}
  • 状态接口(State): 定义了一个接口,用于封装上下文的一个特定状态的行为。
public interface State {
    void handleRequest();
}
  • 具体状态类(Concrete State): 实现了状态接口,具体定义了该状态下的行为。
public class ConcreteStateA implements State {
    public void handleRequest() {
        System.out.println("Handling request in State A");
    }
}

public class ConcreteStateB implements State {
    public void handleRequest() {
        System.out.println("Handling request in State B");
    }
}

优点和缺点

优点:

  1. 封装了转换规则: 将状态的转换规则封装到具体状态类中,使得状态转换更加明确,易于理解和维护。
  2. 避免了条件语句: 状态模式避免了大量的条件语句,使得代码更加清晰,易于扩展。
  3. 增加新的状态容易: 可以很容易地增加新的具体状态类,无需修改原有代码,符合开闭原则。

缺点:

  1. 可能会增加类的数量: 如果状态比较多,可能会导致类的数量增加,增加系统的复杂性。

示例

以下是一个简单的状态模式的示例,模拟了一个文档编辑器的状态,包括编辑状态和预览状态。

// 状态接口
public interface State {
    void handleRequest();
}

// 具体状态类 - 编辑状态
public class EditingState implements State {
    public void handleRequest() {
        System.out.println("Switched to Editing State");
    }
}

// 具体状态类 - 预览状态
public class PreviewState implements State {
    public void handleRequest() {
        System.out.println("Switched to Preview State");
    }
}

// 上下文类
public class Document {
    private State state;

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

    public void request() {
        state.handleRequest();
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Document document = new Document();
        State editingState = new EditingState();
        State previewState = new PreviewState();

        document.setState(editingState);
        document.request(); // 输出:Switched to Editing State

        document.setState(previewState);
        document.request(); // 输出:Switched to Preview State
    }
}

在这个示例中,State 接口定义了两个具体状态类 EditingState 和 PreviewState 共同的行为。Document 类是上下文类,它维护一个当前状态的实例。客户端代码可以通过设置不同的状态,实现文档编辑器的状态切换。在不同的状态下,request() 方法的行为不同,从而实现了状态模式的效果。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注