文章摘要: 状态模式使用总结。
简介
简要说明
- 状态模式(State Pattern)是一种行为型设计模式。
- 将每个状态的行为封装到独立的状态类中,并将状态转换逻辑委托给这些状态类,从而使得状态转换对上下文来说是透明的。
主要功能
- 将与特定状态相关的行为局部化,并将不同状态的行为分割开来。
- 允许状态转换逻辑与状态对象合成一体,而不是分布在上下文中。
- 状态对象可以被共享,减少了上下文对象中的条件判断。
注意事项
- 状态模式可能会导致系统中类数量增加,增加了系统的复杂性。
- 状态转换逻辑可能会变得复杂,尤其是在状态很多的情况下。
适用场景
- 对象的行为依赖于它的状态(属性),并且它可以在运行时根据状态改变行为。
- 代码中包含大量与对象状态有关的条件语句,这些条件语句可以根据对象的状态进行重构。
Java 8
案例
// 状态接口
interface State {
void handle(Context context);
}
// 具体状态类:开启状态
class OnState implements State {
@Override
public void handle(Context context) {
System.out.println("灯泡已经开启。");
// 在开启状态下,调用toggle方法切换到关闭状态
context.setState(new OffState());
}
}
// 具体状态类:关闭状态
class OffState implements State {
@Override
public void handle(Context context) {
System.out.println("灯泡已经关闭。");
// 在关闭状态下,调用toggle方法切换到开启状态
context.setState(new OnState());
}
}
// 上下文类
class Context {
private State state;
// 设置状态
public void setState(State state) {
this.state = state;
}
// 用户操作,委托给状态对象处理
public void toggle() {
state.handle(this);
}
}
// 客户端代码
public class StatePatternDemo {
public static void main(String[] args) {
// 创建上下文对象
Context context = new Context();
// 设置初始状态为开启状态
context.setState(new OnState());
// 连续切换状态两次
context.toggle(); // 输出:灯泡已经开启。
context.toggle(); // 输出:灯泡已经关闭。
}
}
注释
- 在这个例子中,
State是一个接口,定义了一个handle方法,用于处理来自上下文对象的请求。OnState和OffState是具体的状态类,它们实现了State接口,并根据当前状态提供了相应的行为。 Context类是上下文类,它持有一个State对象,并通过setState方法来设置当前状态。toggle方法是用户操作的方法,它将请求委托给当前状态对象处理。- 在客户端代码
StatePatternDemo中,我们创建了Context对象,并设置了初始状态为OnState。通过调用toggle方法,我们可以看到状态在开启和关闭之间切换,并且相应的行为也被正确地执行。