状态模式
状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态发生改变时改变其行为。状态模式使得对象的行为依赖于其内部状态,并且在状态改变时,对象的行为也会随之改变。这个模式的核心思想是将不同的状态封装成不同的类,让状态对象在内部进行切换,而不是将所有的状态逻辑集中在一个对象中。
状态模式主要涉及以下几个角色:
- Context(上下文):维护一个具体状态的实例,这个实例定义了当前对象的状态。Context 类通常会定义一个接口来允许状态对象更改其内部状态。
- State(状态接口):定义一个接口以封装与上下文的一个具体状态相关的行为。状态接口通常会包含一个方法,允许状态对象与上下文对象进行交互,进而切换状态。
- ConcreteState(具体状态):实现状态接口的具体状态类,定义了该状态下对象的具体行为。
示例代码
// 抽象状态类
interface State {
void handle();
}
// 具体状态类A
class ConcreteStateA implements State {
@Override
public void handle() {
System.out.println("当前状态:A");
}
}
// 具体状态类B
class ConcreteStateB implements State {
@Override
public void handle() {
System.out.println("当前状态:B");
}
}
class Context {
private State state;
public Context(State state) {
this.state = state;
}
public void setState(State state) {
this.state = state;
}
public void request() {
state.handle();
}
}
//test
public class TestStatePattern {
public static void main(String[] args) {
Context context = new Context(new ConcreteStateA());
context.request(); // 输出 "当前状态:A"
context.setState(new ConcreteStateB());
context.request(); // 输出 "当前状态:B"
}
}
在这个示例中
State 接口:
State
接口定义了一个方法handle()
,表示当状态切换时应该执行的行为。这个接口的实现类将定义具体的状态行为。
具体状态类 ConcreteStateA
和 ConcreteStateB
:
- 这两个类实现了
State
接口,分别代表两种不同的状态。每个类都重写了handle()
方法,在切换到对应状态时执行特定的逻辑。
Context 类:
Context
类是状态模式的核心,它持有一个State
对象,并负责状态的切换。通过setState()
方法可以动态改变Context
的状态。request()
方法会调用当前状态的handle()
方法,实际执行的逻辑取决于当前的状态对象。
使用场景
状态模式特别适合于以下情况:
- 当一个对象的行为取决于其状态,并且必须在运行时根据状态改变行为。
- 当对象的行为有许多分支,状态模式可以将这些分支逻辑分散到不同的状态类中,减少代码的复杂度。
状态模式帮助将复杂的状态转换逻辑从业务逻辑中分离出来,使代码更加清晰和易于维护。
标签:状态,handle,state,模式,State,Context,public From: https://www.cnblogs.com/20lxj666/p/18396282