在编程王水精灵的奇妙变形记:状态模式的故事国的魔法森林里,住着一位叫"水精灵"的小家伙。它有个神奇的本领:随着温度变化会改变形态!当温度降到0℃以下时,它变成晶莹的冰雕(固态);在0-100℃时,化作流动的溪水(液态);超过100℃时,又变成轻盈的蒸汽(气态)。这种随环境改变行为的能力,正是状态模式的魔法精髓!
🧊 第一章:水精灵的三种面孔
水精灵每次变形时,不仅外观改变,行为也完全不同:
- 冰形态:坚硬如钻石,能划破树叶 $(\text{硬度} > 5)$
- 水形态:柔软似丝绸,可填满容器 $(\text{流动性} = 100%)$
- 蒸汽形态:轻盈若云朵,会向上飘散 $(\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℃ ===
💧 我化作流动的溪水!
✨ 魔法启示录
状态模式的精髓就像水精灵的变形:
- 解耦大师:每个状态独立封装,互不干扰
$$ \text{状态类} \approx \text{独立魔法契约} $$ - 无痛切换:改变状态只需更新上下文引用
$$ \text{context.setState()} \rightarrow \text{形态切换} $$ - 消除条件判断:不再需要复杂的
if-else
温度检测链
当你的程序对象需要像水精灵这样根据环境改变行为时,记住这个魔法口诀:定义状态接口,实现具体状态,上下文掌控切换! 🧙♂️