状态模式是一种行为型设计模式,它允许对象在其内部状态发生改变时改变它的行为。状态模式的关键思想是将对象的行为与其内部状态分离,使得对象在不同的状态下有不同的行为,而这些状态的切换由对象的内部状态决定。

在状态模式中,通常包含以下角色:

1. 上下文(Context): 定义了客户端感兴趣的接口,维护一个具体状态类的实例,将与状态相关的请求委托给当前的具体状态对象处理。
public class Context {
    private State state;

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

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

2. 状态(State): 定义了一个接口,用于封装与上下文的一个特定状态相关的行为。
public interface State {
    void handleRequest(Context context);
}

3. 具体状态(ConcreteState): 实现了状态接口,每个具体状态类都提供了对上下文的不同行为实现。
public class ConcreteStateA implements State {
    @Override
    public void handleRequest(Context context) {
        System.out.println("ConcreteStateA handles the request.");
        context.setState(new ConcreteStateB());
    }
}

public class ConcreteStateB implements State {
    @Override
    public void handleRequest(Context context) {
        System.out.println("ConcreteStateB handles the request.");
        context.setState(new ConcreteStateA());
    }
}

4. 客户端代码: 创建上下文对象,设置初始状态,然后通过不同的请求触发状态的切换。
public class Client {
    public static void main(String[] args) {
        Context context = new Context();

        // 设置初始状态
        context.setState(new ConcreteStateA());

        // 发送请求,切换状态
        context.request();  // Output: ConcreteStateA handles the request.

        // 发送请求,切换状态
        context.request();  // Output: ConcreteStateB handles the request.
    }
}

在这个例子中,Context 类维护一个 State 接口的实例,该接口定义了状态相关的行为。具体的状态类(ConcreteStateA 和 ConcreteStateB)实现了状态接口,分别提供了不同的行为实现。客户端通过发送请求,触发了不同状态下的行为,并导致状态的切换。

状态模式的优势在于它使得状态的变化更加明确,并且能够将与状态相关的代码局部化,从而提高了代码的可维护性和可扩展性。


转载请注明出处:http://www.zyzy.cn/article/detail/13957/设计模式