设计模式 状态模式

本文将介绍设计模式中的状态模式。

一、什么是状态模式?

在程序中,有些对象存在多种状态,对象可以在这些状态之间切换,并且对象在不同状态下具有不同的行为。这样的逻辑如果用 if、else 实现,条件判断语句将会十分复杂,并且也难以维护和扩展。

状态模式用于解决复杂对象的 “状态转换” 和 “不同状态下的行为切换” 问题,它将对象的状态从对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化。

二、实现

1. 结构

2. 角色

  • Context 环境类:
    • 即拥有多个状态的对象
    • 维护一个类型为 State 的实例
    • 通过调用 State 实例来进行特定状态下的行为
  • State 抽象状态类:
    • 定义了与状态相关的方法
  • ConcreteState 具体状态类:
    • 每一个具体状态类对应着一个状态
    • 实现了 State 中定义的方法

3. 简单示例

Context:

1
2
3
4
5
6
7
8
9
publice class Context {
private State state;

public void request() {
// ···
state.handle();
// ···
}
}

State:

1
2
3
public abstract class State {
public abstract void handle();
}

ConcreteState:

1
2
3
4
5
public class ConcreteState extends State {
public void handle() {
// ···
}
}

状态的维护:

  • 可以统一由环境类来负责状态之间的转换,通过对某些属性值的判断来实现状态转换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    publice class Context {
    private State state;

    private int value;

    public void setState() {
    if (value == 0) {
    state = ···;
    } else {
    state = ···;
    }
    }

    public void request() {
    // ···
    state.handle();
    // ···
    }
    }
  • 可以由状态类负责,提供一个方法供 Context 调用以修改状态

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public abstract class State {
    public abstract void handle();

    public void setState(Context context) {
    if (context.getValue() == 0) {
    state = ···;
    } else {
    state = ···;
    }
    }
    }

三、优缺点

1. 优点

  • 可以使用更优雅的方式维护有状态对象

2. 缺点

  • 增加系统中类的数目
  • 不符合开闭原则,增加新的状态类时需要修改状态转换相关代码

参考

  • 《Java 设计模式》