状态

    状态模式(State)经常用在带有状态的对象中。

    什么是状态?我们以QQ聊天为例,一个用户的QQ有几种状态:

    • 离线状态(尚未登录);
    • 正在登录状态;
    • 在线状态;
    • 忙状态(暂时离开)。

    如何表示状态?我们定义一个就可以表示不同的状态。但不同的状态需要对应不同的行为,比如收到消息时:

    状态模式的目的是为了把上述一大串if…else…的逻辑给分拆到不同的状态类中,使得将来增加状态比较容易。

    • 未连线;
    • 已连线。

    对于未连线状态,我们收到消息也不回复:

    1. public class DisconnectedState implements State {
    2. public String init() {
    3. return "Bye!";
    4. }
    5. public String reply(String input) {
    6. return "";
    7. }
    8. }

    对于已连线状态,我们回应收到的消息:

    状态模式的关键设计思想在于状态切换,我们引入一个BotContext完成状态切换:

    1. private State state = new DisconnectedState();
    2. public String chat(String input) {
    3. if ("hello".equalsIgnoreCase(input)) {
    4. // 收到hello切换到在线状态:
    5. state = new ConnectedState();
    6. return state.init();
    7. } else if ("bye".equalsIgnoreCase(input)) {
    8. state = new DisconnectedState();
    9. return state.init();
    10. return state.reply(input);
    11. }
    12. }

    这样,一个价值千万的AI聊天机器人就诞生了:

    1. > hello
    2. < Hello, I'm Bob.
    3. > Nice to meet you.
    4. < Nice to meet you!
    5. > Today is cold?
    6. < Yes. Today is cold!
    7. > bye

    从下载练习:新增BusyState状态表示忙碌 (推荐使用快速下载)

    状态模式的设计思想是把不同状态的逻辑分离到不同的状态类中,从而使得增加新状态更容易;

    状态模式的实现关键在于状态转换。简单的状态转换可以直接由调用方指定,复杂的状态转换可以在内部根据条件触发完成。

    状态 - 图1