在状态模式中,通常包含以下角色:
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/设计模式