java状态模式:水精灵的奇妙变形记

状态模式在Java中的实现与应用

在编程王水精灵的奇妙变形记:状态模式的故事国的魔法森林里,住着一位叫"水精灵"的小家伙。它有个神奇的本领:随着温度变化会改变形态!当温度降到0℃以下时,它变成晶莹的冰雕(固态);在0-100℃时,化作流动的溪水(液态);超过100℃时,又变成轻盈的蒸汽(气态)。这种随环境改变行为的能力,正是状态模式的魔法精髓!


🧊 第一章:水精灵的三种面孔

水精灵每次变形时,不仅外观改变,行为也完全不同:

  1. 冰形态:坚硬如钻石,能划破树叶 $(\text{硬度} > 5)$
  2. 水形态:柔软似丝绸,可填满容器 $(\text{流动性} = 100%)$
  3. 蒸汽形态:轻盈若云朵,会向上飘散 $(\text{密度} < 0.6)$

就像状态模式中的具体状态类,每个形态都有独立的属性和行为规则。


🔮 第二章:魔法契约的奥秘

水精灵体内藏着三件魔法契约:

// 状态接口:定义所有形态的公共行为
interface WaterState {
    void showForm();      // 展示形态
    void changeState(WaterContext context); // 变形规则
}

// 固态契约:冰之法则
class IceState implements WaterState {
    public void showForm() {
        System.out.println("❄️ 我变成坚硬的冰晶!");
    }
    public void changeState(WaterContext context) {
        if (context.getTemperature() > 0) {
            context.setState(new LiquidState()); // 温度>0℃时融化成水
        }
    }
}

// 液态契约:水之韵律
class LiquidState implements WaterState {
    public void showForm() {
        System.out.println("💧 我化作流动的溪水!");
    }
    public void changeState(WaterContext context) {
        double temp = context.getTemperature();
        if (temp <= 0) {
            context.setState(new IceState());    // 温度≤0℃时结冰
        } else if (temp >= 100) {
            context.setState(new GasState());     // 温度≥100℃时汽化
        }
    }
}

// 气态契约:蒸汽之舞
class GasState implements WaterState {
    public void showForm() {
        System.out.println("☁️ 我升腾为飘逸的蒸汽!");
    }
    public void changeState(WaterContext context) {
        if (context.getTemperature() < 100) {
            context.setState(new LiquidState()); // 温度<100℃时凝结
        }
    }
}


🌡️ 第三章:温度魔杖的掌控

水精灵手持温度魔杖(上下文类),它记录当前状态并触发变形:

// 上下文类:掌控状态的魔法杖
class WaterContext {
    private WaterState currentState;
    private double temperature;

    public WaterContext() {
        this.temperature = 25; // 默认25℃的液态
        this.currentState = new LiquidState();
    }

    // 魔法:改变温度触发变形
    public void setTemperature(double temp) {
        this.temperature = temp;
        System.out.printf("\n=== 温度变化: %.1f℃ → %.1f℃ ===\n", 
                          this.temperature, temp);
        currentState.changeState(this); // 触发状态检查
        currentState.showForm();       // 展示新形态
    }

    // 秘术:切换形态
    public void setState(WaterState state) {
        this.currentState = state;
    }

    public double getTemperature() {
        return temperature;
    }
}


🪄 第四章:魔法实验秀

让我们见证水精灵的变形奇迹:

public class StatePatternDemo {
    public static void main(String[] args) {
        WaterContext water = new WaterContext();

        water.setTemperature(-10);  // ❄️ 冰形态
        water.setTemperature(50);   // 💧 水形态
        water.setTemperature(150);  // ☁️ 蒸汽形态
        water.setTemperature(80);   // 💧 变回水形态
    }
}

运行结果

=== 温度变化: 25.0℃ → -10.0℃ ===
❄️ 我变成坚硬的冰晶!

=== 温度变化: -10.0℃ → 50.0℃ ===
💧 我化作流动的溪水!

=== 温度变化: 50.0℃ → 150.0℃ ===
☁️ 我升腾为飘逸的蒸汽!

=== 温度变化: 150.0℃ → 80.0℃ ===
💧 我化作流动的溪水!


✨ 魔法启示录

状态模式的精髓就像水精灵的变形:

  1. 解耦大师:每个状态独立封装,互不干扰
    $$ \text{状态类} \approx \text{独立魔法契约} $$
  2. 无痛切换:改变状态只需更新上下文引用
    $$ \text{context.setState()} \rightarrow \text{形态切换} $$
  3. 消除条件判断:不再需要复杂的if-else温度检测链

当你的程序对象需要像水精灵这样根据环境改变行为时,记住这个魔法口诀:定义状态接口,实现具体状态,上下文掌控切换! 🧙‍♂️