10Head First Design Patterns(第2版)

状态模式

状态转换

状态模式状态机状态转换上下文

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第10章:状态模式(State Pattern)

一、导读

1.1 本章学习目标

第10章讲解状态模式——允许对象在内部状态改变时改变其行为。

1.2 为什么第十章如此重要

状态模式将状态封装为独立的类,消除了大量的条件判断语句。

1.3 核心问题引导

状态模式如何消除条件判断?

状态转换如何管理?

状态模式和策略模式有什么区别?

状态机如何设计?


二、核心概念详解

10.1 状态模式

java
// 状态接口
public interface State {
    void insertQuarter();
    void ejectQuarter();
    void turnCrank();
    void dispense();
}

// 具体状态
public class NoQuarterState implements State {
    GumballMachine machine;
    
    public NoQuarterState(GumballMachine machine) {
        this.machine = machine;
    }
    
    public void insertQuarter() {
        System.out.println("Quarter inserted");
        machine.setState(machine.getHasQuarterState());
    }
    
    public void ejectQuarter() {
        System.out.println("No quarter to eject");
    }
    
    public void turnCrank() {
        System.out.println("No quarter inserted");
    }
    
    public void dispense() {
        System.out.println("No quarter inserted");
    }
}

// 上下文
public class GumballMachine {
    State noQuarterState;
    State hasQuarterState;
    State soldState;
    State soldOutState;
    
    State state;
    int count;
    
    public GumballMachine(int count) {
        noQuarterState = new NoQuarterState(this);
        hasQuarterState = new HasQuarterState(this);
        soldState = new SoldState(this);
        soldOutState = new SoldOutState(this);
        
        this.count = count;
        state = count > 0 ? noQuarterState : soldOutState;
    }
    
    public void insertQuarter() { state.insertQuarter(); }
    public void ejectQuarter() { state.ejectQuarter(); }
    public void turnCrank() { state.turnCrank(); state.dispense(); }
    
    void setState(State state) { this.state = state; }
}

10.2 状态 vs 策略

状态模式:
- 封装不同的状态
- 状态之间可以转换
- 客户端不直接控制状态

策略模式:
- 封装不同的算法
- 客户端选择策略
- 策略之间不转换

三、实战案例

10.1 订单状态机

java
public enum OrderState {
    CREATED {
        public OrderState next() { return CONFIRMED; }
    },
    CONFIRMED {
        public OrderState next() { return SHIPPED; }
    },
    SHIPPED {
        public OrderState next() { return DELIVERED; }
    },
    DELIVERED {
        public OrderState next() { return COMPLETED; }
    },
    COMPLETED {
        public OrderState next() { throw new IllegalStateException(); }
    };
    
    public abstract OrderState next();
}

四、本章小结

状态模式将状态封装为独立的类,消除条件判断。状态之间可以转换。与策略模式的区别在于状态自动转换,策略由客户端选择。


五、思考与练习

状态模式如何消除条件判断?

状态转换如何管理?

状态模式和策略模式有什么区别?

如何实现并发安全的状态机?

状态模式在哪些场景中应用?


10/12状态模式
0%